Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Глобальные хуки в Windows

Библиотека WindowsHookLib позволяет перехватывать мышку, клавиатуру и буфер обмена. WindowsHookLib использует Common Language Runtime (CLR), поэтому её можно использовать в различных .NET-проектах. Перхват мышки и клавиатуры осуществляется на низком уровне, соответственно, библиотека позволяет обрабатывать MouseEventArgs или KeyboardEventArgs и предотвращать попадание сообщений в окошки других приложений. Для корректной обработки хуков, потребуется включить в проект DLL-ку из библиотеки.

Этот компонент несколько отличается от многих аналогичных и позволяет реализовать две дополнительные вещи:

1. Предотвращение попадание сообщений в окошки других приложений.
2. Перехват событий MouseClick и MouseDoubleClick.

Перехват мыши

Для глобального перехвата мышки (включая некоторые полезные события) в WindowsHookLib предназначен класс MouseHook. Так как перехват таких событий как MouseClick и MouseDoubleClick, генерируемых на уровне приложения, невозможен на низком уровне, то MouseHook имитирует эти события. Для обработки этих событий необходимо экземпляр класса объявить с ключевым словом WithEvents.

Обработчики событий MouseDown, MouseUp, MouseWheel и MouseMove используют объект класса WindowsHookLib.MouseEventArgs, который содержит все необходимые сведения о мышке (наподобие System.Windows.Forms.MouseEventArgs) плюс два дополнительных свойства - Handled и Control. Для предотвращения попадания сообщений в другие окошки, можно установить свойство Handled в True. Свойство Control позволяет отслеживать перемещение курсора мышки. Желательно устанавливать свойство Handled синхронно для событий MouseUp и MouseDown. Если свойство Handled не установить синхронно, то мышка может перестать работать.

Примечание: Перед выходом из приложения необходимо удалить хук и освободить переменные класса, для этого нужно вызвать метод Dispose в объекте хука.

Перехват клавиатуры

Класс KeyboardHook позволяет обрабатывать три события, из которых KeyDown и KeyUp имеют объект WindowsHookLib.KeyEventArgs, содержащий необходимую информацию о нажатии клавиши (наподобие System.Windows.Forms.KeyEventArgs). Как в и хуке мышки, свойство Handled в обработчиках KeyDown и KeyUp можно установить в True, чтобы недопустить попадания сообщений в окошки других приложений.

Перехват буфера обмена

Класс ClipboardHook позволяет обрабатывать два события: ClipbordChanged и StateChanged. Обработчик событий ClipboardChanged имеет объект WindowsHookLib.ClipboardEventArgs, содержащий всю необходимую информацию о событии.

Пример использования библиотеки

Если Вы хотите использовать метод описаний, то скопируйте файл WindowsHookLib.xml в папку вашего проекта.

Imports WindowsHookLib
 
'Объявление экземпляров классов
Dim WithEvents kHook As New KeyboardHook
Dim WithEvents mHook As New MouseHook
Dim WithEvents cHook As New ClipboardHook
 
'Allowed control handle list
Dim alowedList As New List(Of IntPtr)
 
Try
    'Устанавливаем хуки
    kHook.InstallHook()
    mHook.InstallHook()
    cHook.InstallHook(Me) 'В качество параметра используется окно.
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try
 
Try
    'Удаляем хуки
    kHook.RemoveHook()
    mHook.RemoveHook()
    cHook.RemoveHook()
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try
 
Private Sub kHook_KeyDown( _
  ByVal sender As Object, _
  ByVal e As WindowsHookLib.KeyEventArgs) Handles kHook.KeyDown
    'Блокируем комбинацию клавиш Alt+PrintScreen
    e.Handled = (e.Modifiers = Keys.Alt AndAlso _
                 e.KeyCode = Keys.PrintScreen)
End Sub
 
Private Sub mHook_MouseDown( _
  ByVal sender As Object, _
  ByVal e As WindowsHookLib.MouseEventArgs) Handles mHook.MouseDown
    'Устанавливаем свойство Handled для события нажатия мышки,
    'чтобы заблокировать событие клика для контролов не прописанных в alowedList.
    e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
    'Далее что-нибудь делаем
    '...
    '...
End Sub
 
Private Sub mHook_MouseUp( _
  ByVal sender As Object, _
  ByVal e As WindowsHookLib.MouseEventArgs) Handles mHook.MouseUp
    'Устанавливаем свойство Handled для события отпускания кнопки мышки,
    'чтобы заблокировать это событие для контролов не прописанных в alowedList.
    e.Handled = Not Me.alowedList.Contains(Ctype(sender,IntPtr))
    'Далее что-нибудь делаем
    '...
    '...
End Sub
 
Private Sub cHook_ClipboardChanged( _
  ByVal sender As Object, _
  ByVal e As WindowsHookLib.ClipboardEventArgs) _
  Handles cHook.ClipboardChanged
    'Содержимое буфера обмена изменилось, обрабатываем это.
    '...
    '...
End Sub

Дополнительные примеры можно посмотреть в исходниках и демо-проекте.

Для перехвата и отслеживания Windows сообщений библиотека использует следующие API-функции:

SetWindowsHookEx
UnhookWindowsHookEx
CallNextHookEx
WindowFromPoint
SendInput
SetClipboardViewer
ChangeClipboardChain

Скачать библиотеку - 17 кб

Скачать демо-проект с исходниками - 131 кб




Основные разделы сайта


 

Реклама Купить 3g оборудование можно тут