1.在C#中使用Windows API時必須先使用DllImport來Include相關的library:
example :
using System.Runtime.InteropServices;
using System.Diagnostics;
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(
HookType code,
MSHookProc func,
IntPtr instance,
int threadID
);
2.在C#中並沒有C/C++的function pointer,因此在C#中必須改用Delegate(委派)的方法。
example:
private delegate int MSHookProc(
int code,
IntPtr wParam,
ref MSDLLHOOKSTRUCT lParam
);
_MouseHookHandle = SetWindowsHookEx(
HookType.WH_MOUSE_LL,
_MouseHookFunction,
GetModuleHandle(curModule.ModuleName),
0
);
3.上述HOOK產生的Thread並不是UI Thread因此不能直接變更UI Thread中的物件內容,
必須在UI Thread中建立一個新的Delegate,讓HOOK的Thread透過Invoke或BeginInvoke
這個新的Delegate切換至UI Thread。
example:
private delegate void ShowDataDelegate(
HookType Type,
int code,
IntPtr wParam,
object lParam
);
private static Delegate ShowDataProc;
private void HookSample_Load(object sender, EventArgs e){
ShowDataProc = new ShowDataDelegate(ShowDataFunc);
}
private static int MouseHookCallback(
int code,
IntPtr wParam,
ref MSDLLHOOKSTRUCT lParam){
object[] args = new object[4];
args[0] = (HookType) HookType.WH_MOUSE_LL;
args[1] = (int)code;
args[2] = (IntPtr)wParam;
args[3] = (object)lParam;
ShowDataProc.DynamicInvoke(args);
return CallNextHookEx(_MouseHookHandle, code, wParam, ref lParam);
}
Download : UseHookSample.zip UseHookSample.exe
Result: