java设置windows窗体钩子监听WH_CALLWNDPROC总是不成功,后来发现是对参数有要求,现将正确的代码记录下来,方便以后使用。
- 线程id不能使用0
- threadId不能使用java的线程id 错误代码:long threadId = Thread.currentThread().getId();
- 使用窗体句柄获取HINSTANCE不成功
- HINSTANCE hInstance = new HINSTANCE();
- hInstance.setPointer(winHwnd.getPointer());
正确代码:
Win32Hook hookProc = new Win32Hook() {
public LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam) {
System.out.println("HOOKPROC,nCode: " + nCode);
return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam);
}
};
HINSTANCE hInstance = Kernel32.INSTANCE.GetModuleHandle(null);
int threadId = (int) Kernel32.INSTANCE.GetCurrentThreadId();
HHOOK hook = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_CALLWNDPROC,
hookProc, hInstance, threadId);
if (hook == null) {
int errorCode = Kernel32.INSTANCE.GetLastError();
System.out.println("SetWindowsHookEx, errorCode:" + errorCode);
}