|
Программирование >> Автоматически обновляемые приложения
Работа с функциями обратного вызова в С# Для использования функций, написанных на С#, в качестве функций обратного вызова Windows нужно использовать делегаты (delegate). Пример показан в листинге 17.8. ; Листинг 17.8. Использование делегатов для функции обратного вызова delegate bool EnumWindowsCB(int hwnd, int Iparam) ; Объявив свой тип делегата, можно написать оболочку для функции Windows API, как это сделано в листинге 17.9. \ Листинг 17.9. Оболочка для функции Windows API [Dlllmport( user32 )] public static extern int EnumWindows(EnumWindowsCB cb, int Iparam) ; Создание собственной управляемой библиотеки Можно создать собственную управляемую библиотеку, из которой можно будет вызывать функции Windows API. Для этого в Visual Studio предусмотрены специальные опции. Новый проект создается как библиотека классов (Class Library). Сборка при этом автоматически получает расширение dll. Использовать управляемую библиотеку в управляемом коде просто. Для этого надо добавить ссылку (используя меню Project Add Reference...) на библиотечную сборку, указав месторасположение сборки в соответствующем диалоговом окне. После этого Visual Studio копирует сборку в директорию, в которой располагается разрабатываемый код. Далее в коде программы используется либо оператор using, либо полное имя библиотечного модуля с 16 Зак 262 \ Листинг 17.7. Использование структуры в виде класса Если RECT - класс, а не структура (struct) [Dlllmport( user32.dll )] public static extern int GetWindowRect(IntPtr hwnd, [MarshalAs(UnmanagedType.LPStruct)] RECT rc); Примеры использования функций API Вкратце ознакомившись с теорией, перейдем к конкретным примерам. В предыдущих главах я уже неоднократно приводил пример использования функций Windows API для решения различных проблем. Рассмотрим еще несколько полезных советов, которые не вошли в другие главы. Блокировка компьютера Если вам необходимо блокировать компьютер, то вызовите функцию Lockworkstation (ЛИСТИНГ 17.10). Результат работы будет аналогичен нажатию комбинации клавиш <Win>+<L> или <Ctrl>+<Alt>+<Del> с последующим выбором кнопки (или команды меню) Блокировка. i Листинг 17.10. Блокировка компьютера Функция для блокировки компьютера [Dlllmport( user32.dll )] private static extern void LockWorkStation() , Блокируем компьютер LockworkstationО ; Является ли текущий пользователь администратором? Если необходимо удостовериться, что текущий пользователь имеет права администратора, то можно вызвать функцию isUserAnAdmin, как показано в листинге 17.11. точечной нотацией. Все библиотечные классы и методы готовы к использованию в коде программы. Примечание Пример создания библиотеки и использования функций Windows API находится в папке Win32 на прилагаемом диске \ Листинг 17.11. Проверка текущего пользователя [Dlllmport( shell32.dll )] public static extern bool IsUserAnAdmm () ; private void butIsAdmin Click(object sender, EventArgs e) { MessageBox. Show (IsUserAnAdmm 0 .ToStringO ) ; Мигание заголовка формы Наверное, вам приходилось видеть, что заголовок окна вдруг начинал мигать, привлекая ваше внимание. Подобный эффект реализуется вызовом функций Fiashwindow ИЛИ FiashwindowsEx. Я решил показать вам пример использования функции FiashwindowEx, как более мощной и современной. Поместите на форму кнопку и напишите код, приведенный в листинге 17.12. I Листинг 17.12. Мигание кнопки программы в панели задач Функция, константы и структура для мигания окна public const int FLASHW STOP = 0; public const int FLASHW CAPTION = 0x00000001; public const int FLASHW TRAY = 0x00000002; public const int FLASHW ALL = (FLASHW CAPTION FLASHW TRAY). public const int FLASHW TIMER = 0x00000004; public const int FLASHW TIMERNOFG = OxOOOOOOOC; [StructLayout(LayoutKind.Sequential)] public struct FLASHWINFO { [MarshalAs(UnmanagedType.U4)] public int cbSize; public IntPtr hwnd; [MarshalAs(UnmanagedType.U4)] public int dwFlags; [MarshalAs(UnmanagedType.U4)] public int uCount; [MarshalAs(UnmanagedType.U4)] public int dwTimeout;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |