2011-08-03 41 views
5

我怎么能建立窗户WH_FOREGROUNDIDLE钩和下面的回拨功能如何回调函数映射与Java本机访问(JNA)

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

我想,当一个线程/进程进入空闲状态检测。

我已经使用以下功能获得threadProccessId

GetForegroundWindow -> GetWindowThreadProcessId. 

回答

0
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); 

编辑:添加一个return语句。

+0

我应该返回什么?当我重写调用按钮时,它要求我返回一些东西。 msdn说,当ForegroundIdleProc返回0时应该调用CallNextHookEx。我在这里有点困惑。 – paktrick

+0

根据MSDN'如果代码小于零,挂钩过程必须返回CallNextHookEx返回的值。 如果代码大于或等于零,强烈建议您调用CallNextHookEx并返回它返回的值;否则,已安装WH_FOREGROUNDIDLE挂钩的其他应用程序将不会收到挂接通知,并可能因此导致行为不正确。如果挂钩过程不调用CallNextHookEx,则返回值应为零 – Abhijith

0

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