Программирование >>  Автоматически обновляемые приложения 

1 ... 150 151 152 [ 153 ] 154 155 156 ... 170


Работа с функциями обратного вызова в С#

Для использования функций, написанных на С#, в качестве функций обратного вызова 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;



1 ... 150 151 152 [ 153 ] 154 155 156 ... 170

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика