2013-12-16 60 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

當然,給我一秒鐘。 –

相關問題