2011-08-03 17 views
5

Làm thế nào tôi có thể thiết lập các cửa sổ treo với WH_FOREGROUNDIDLE và cuộc gọi sau lại Chức nănglàm thế nào để lập bản đồ Chức năng gọi lại với Java truy cập nguồn gốc (JNA)

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

Tôi cố gắng để phát hiện khi một sợi/quá trình đi nhàn rỗi.

tôi đã có được threadProccessId bằng cách sử dụng các chức năng sau:

GetForegroundWindow -> GetWindowThreadProcessId. 

Trả lời

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: Thêm một lệnh return.

+0

Tôi nên trở về cái gì? khi tôi ghi đè lên nút gọi nó yêu cầu tôi trả lại một cái gì đó. msdn nói CallNextHookEx nên được gọi khi ForegroundIdleProc trả về 0. Tôi đang bối rối ở đây một chút. – paktrick

+0

Theo MSDN 'Nếu mã nhỏ hơn 0, thủ tục móc phải trả về giá trị trả về bởi CallNextHookEx. Nếu mã lớn hơn hoặc bằng 0, bạn nên gọi CallNextHookEx và trả lại giá trị nó trả về; nếu không, các ứng dụng khác đã cài đặt móc WH_FOREGROUNDIDLE sẽ không nhận được thông báo móc và có thể hoạt động không chính xác như vậy. Nếu thủ tục móc không gọi CallNextHookEx, giá trị trả về phải bằng không. – Abhijith

0

Kéo dài StdCallCallback thay vì gọi lại để nhận cuộc gọi lại được gọi với quy ước gọi điện chính xác. Theo win32 macro "CALLBACK" thường giải quyết thành _stdcall.

Các vấn đề liên quan