如何使用Java本机访问(JNA)映射回调函数

如何使用Java本机访问(JNA)映射回调函数,java,winapi,jna,Java,Winapi,Jna,如何使用WH_FOREGROUNDIDLE和以下回调函数设置windows挂钩 DWORD CALLBACK ForegroundIdleProc( __in int code, DWORD wParam, LONG lParam ); 我试图检测线程/进程何时空闲 我使用以下函数获得了ThreadProcessId: GetForegroundWindow -> GetWindowThreadProcessId. EDIT:添加了一个return语句。扩展StdCallCallbac

如何使用
WH_FOREGROUNDIDLE
和以下回调函数设置windows挂钩

DWORD CALLBACK ForegroundIdleProc( __in int code, DWORD wParam, LONG lParam );
我试图检测线程/进程何时空闲

我使用以下函数获得了
ThreadProcessId

GetForegroundWindow -> GetWindowThreadProcessId.

EDIT:添加了一个return语句。

扩展StdCallCallback而不是Callback,以便使用正确的调用约定调用回调。在win32下,宏“回调”通常解析为_stdcall。

我应该返回什么?当我重写invoke按钮时,它会要求我返回一些内容。msdn说当ForegroundIdleProc返回0时应该调用CallNextHookEx。我在这里有点困惑。根据MSDN
的说法,如果代码小于零,钩子过程必须返回CallNextHookEx返回的值。如果代码大于或等于零,强烈建议调用CallNextHookEx并返回它返回的值;否则,安装了WH_FOREGROUNDIDLE钩子的其他应用程序将不会收到钩子通知,并可能因此行为不正确。如果钩子过程不调用CallNextHookEx,则返回值应为零。
 public static interface ForegroundIdleProc extends Callback(){
   int invoke(int code, int wParam , NativeLong lParam);
 }

 /*....Usage....*/
 ForegroundIdleProc proc = new ForegroundIdleProc(){
   int invoke(int code, int wParam , NativeLong lParam){
      /* Handle callback */
       /*Make sure you define this function first.*/
       return NativeLibrary.Instance.CallNextHookEx(NULL , code , wParam , lParam);
   } 
 }

 NativeLibrary.Instance.SetWindowsHookEx(WH_FOREGROUNDIDLE , proc , etc etc);