Java使用SetWindowsHookEx函数监听WH_CALLWNDPROC窗体消息

61 阅读1分钟

java设置windows窗体钩子监听WH_CALLWNDPROC总是不成功,后来发现是对参数有要求,现将正确的代码记录下来,方便以后使用。

  1. 线程id不能使用0
  2. threadId不能使用java的线程id 错误代码:long threadId = Thread.currentThread().getId();
  3. 使用窗体句柄获取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);
        }