- 更新 -
你可以使用设置WindowsHookEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx监视当前桌面,但这在托管代码中不起作用。相反,您必须使用设置WinEventHook http://msdn.microsoft.com/en-us/library/dd373640%28v=vs.85%29.aspx.
您曾问过如何使用设置WinEventHook http://msdn.microsoft.com/en-us/library/dd373640%28v=vs.85%29.aspxp/调用方法。这是你的答案:
首先确保此行位于代码文件的顶部:
Imports System.Runtime.InteropServices
接下来,声明调用该调用所需的所有内容:
Public Const WINEVENT_OUTOFCONTEXT = &H0
'' Events are ASYNC
Public Const WINEVENT_SKIPOWNTHREAD = &H1
'' Don't call back for events on installer's thread
Public Const WINEVENT_SKIPOWNPROCESS = &H2
'' Don't call back for events on installer's process
Public Const WINEVENT_INCONTEXT = &H4
'' Events are SYNC, this causes your dll to be injected into every process
Public Declare Function SetWinEventHook Lib "user32.dll" _
(eventMin As UInteger, _
eventMax As UInteger, _
hmodWinEventProc As IntPtr, _
lpfnWinEventProc As IntPtr, _
idProcess As UInteger, _
idThread As UInteger, _
dwflags As UInteger) As IntPtr
Public Declare Function UnhookWinEvent Lib "user32.dll" _
(hWinEventHook As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
Public Delegate Sub WinEventProc( _
hWinEventHook As IntPtr, _
[event] As UInteger, _
hwnd As IntPtr, _
idObject As Integer, _
idChild As Integer, _
dwEventThread As UInteger, _
dwmsEventTime As UInteger)
接下来,您将一个函数和一个新变量声明为函数,并带有该函数的地址:
Public Sub EventCallBack( _
hWinEventHook As IntPtr, _
[event] As UInteger, _
hwnd As IntPtr, _
idObject As Integer, _
idChild As Integer, _
dwEventThread As UInteger, _
dwmsEventTime As UInteger)
' Some code goes here
End Sub
Private eventProc As New WinEventProc(AddressOf EventCallBack)
Private hEventHook As IntPtr
最后,将它们连接在一起,并传递以下代码行来创建挂钩(0 和 255 是任意数字,将它们替换为您想要观看的最小和最大消息代码):
hEventHook = SetWinEventHook(0, _
255, _
IntPtr.Zero, _
Marshal.GetFunctionPointerForDelegate(eventProc), _
0, _
0, _
WINEVENT_OUTOFCONTEXT)
当您的程序完成时,将以下行添加到应用程序终止事件或表单的 Dispose 或 Finalize 方法中:
UnhookWinEvent(hEventHook)
这在我的测试应用程序上按预期运行。