【问题标题】:how to map callback Function with Java native access (JNA)如何使用 Java 本机访问 (JNA) 映射回调函数
【发布时间】:2011-10-19 02:05:05
【问题描述】:

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

DWORD CALLBACK ForegroundIdleProc( __in int code, DWORD wParam, LONG lParam );

我正在尝试检测线程/进程何时空闲。

我通过以下函数获得了threadProccessId

GetForegroundWindow -> GetWindowThreadProcessId.

【问题讨论】:

    标签: java winapi jna


    【解决方案1】:
     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);
    

    编辑:添加了返回语句。

    【讨论】:

    • 我应该返回什么?当我覆盖调用按钮时,它要求我返回一些东西。 msdn说当ForegroundIdleProc返回0时应该调用CallNextHookEx。我在这里有点困惑。
    • 根据 MSDN If code is less than zero, the hook procedure must return the value returned by CallNextHookEx. If code is greater than or equal to zero, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_FOREGROUNDIDLE hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure does not call CallNextHookEx, the return value should be zero.
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多