2011-08-03 5 views
5

Jak mogę skonfigurować szyby hak z WH_FOREGROUNDIDLE i następujący oddzwonić Funkcjejak mapować funkcję zwrotną z Java Native dostępu (JNA)

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

Próbuję wykryć, gdy wątek/proces idzie bezczynny.

Ja osiągnąłem threadProccessId za pomocą następujących funkcji:

GetForegroundWindow -> GetWindowThreadProcessId. 

Odpowiedz

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

EDIT: Dodano instrukcji return.

+0

Co powinienem zwrócić? kiedy nadpisuję przycisk wywołania, prosi mnie o zwrot. msdn mówi, że CallNextHookEx powinno zostać wywołane, gdy ForegroundIdleProc zwraca 0. jestem trochę zdezorientowany. – paktrick

+0

Według MSDN 'Jeśli kod jest mniejszy od zera, procedura haka musi zwrócić wartość zwróconą przez CallNextHookEx. Jeśli kod jest większy lub równy zeru, zaleca się wywoływanie CallNextHookEx i zwracanie zwracanej wartości; w przeciwnym razie inne aplikacje, które zainstalowały haki WH_FOREGROUNDIDLE, nie będą otrzymywać powiadomień o hakowaniu i mogą zachowywać się niepoprawnie. Jeśli procedura haka nie wywołuje CallNextHookEx, zwracana wartość powinna wynosić zero – Abhijith

0

Rozszerz StdCallCallback zamiast Callback, aby wywołać wywołanie zwrotne z właściwą konwencją wywołania. Pod Win32 makro "CALLBACK" zwykle przechodzi na _stdcall.