2013-12-16 61 views

回答

2

- 更新 -

你可以使用SetWindowsHookEx监视当前桌面,但这并不在托管代码工作。相反,您必须使用SetWinEventHook

你问如何使用SetWinEventHook P/Invoke方法。这里是你的答案:

首先确保这条线是在你的代码文件的顶部:

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 

Fin盟友,你将其结合在一起,和你通过下面的代码行创建你的钩子(0和255为任意数字,你想要观看的最小和最大消息代码替换它们):

hEventHook = SetWinEventHook(0, _ 
          255, _ 
          IntPtr.Zero, _ 
          Marshal.GetFunctionPointerForDelegate(eventProc), _ 
          0, _ 
          0, _ 
          WINEVENT_OUTOFCONTEXT) 

当你的程序已经完成了以下行添加到应用程序终止事件,或窗体的Dispose或无法最终确定方法:

 UnhookWinEvent(hEventHook) 

而这个运行在我的测试应用程序如预期。

+0

不要忘记调用CallNextHookEx方法()当您完成,使得被钩到桌面其它程序继续正常工作。 –

+0

好吧,我从来没有与调用SetWindowsHookEx或钩一般工作过,并且该链接只有C++ xyntax,你可以提供什么,我想在vb.net代码做一个适当的声明? 这似乎有点让我困惑,谢谢。 – SomeNickName

+0

当然,给我一秒钟。 –

相关问题