1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| Public Class FlashWindowHook
Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As CallBack, ByVal hmod As IntPtr, ByVal dwThreadId As Integer) As IntPtr
Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As IntPtr) As Integer
Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
'Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
'Private Declare Function GetLastError Lib "kernel32" () As IntPtr
'Events
Public Shared Event FlashWindow(ByVal WindowHandle As IntPtr)
'HookTypes
Private Const WH_SHELL As Integer = 10
'ShellHookMessages
Private Enum ShellHookMessages
HSHELL_WINDOWCREATED = 1
HSHELL_WINDOWDESTROYED = 2
HSHELL_ACTIVATESHELLWINDOW = 3
HSHELL_WINDOWACTIVATED = 4
HSHELL_GETMINRECT = 5
HSHELL_REDRAW = 6
HSHELL_TASKMAN = 7
HSHELL_LANGUAGE = 8
HSHELL_SYSMENU = 9
HSHELL_ENDTASK = 10
HSHELL_ACCESSIBILITYSTATE = 11
HSHELL_APPCOMMAND = 12
HSHELL_WINDOWREPLACED = 13
HSHELL_WINDOWREPLACING = 14
End Enum
Private Shared HHookID As IntPtr = IntPtr.Zero
Private Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Private Shared ShellProcDelegate As New CallBack(AddressOf ShellProc)
Private Shared Function ShellProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
If ((nCode = ShellHookMessages.HSHELL_REDRAW) AndAlso (CBool(lParam))) Then
RaiseEvent FlashWindow(wParam)
End If
'Form1.RichTextBox1.Text &= vbCrLf & CStr(nCode) & " " & CStr(wParam) & " " & CStr(lParam)
Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
End Function
Public Shared Sub Hook()
HHookID = SetWindowsHookEx(WH_SHELL, ShellProcDelegate, IntPtr.Zero, 0)
If (HHookID = IntPtr.Zero) Then
'MessageBox.Show(GetLastError)
Throw New Exception("Could not set keyboard hook !")
End If
End Sub
Public Shared Sub UnHook()
If (HHookID <> IntPtr.Zero) Then
UnhookWindowsHookEx(HHookID)
End If
End Sub
End Class |
Partager