2010-01-30 23 views
5

Tôi đang tạo ứng dụng bảng điều khiển mà tôi muốn ghi lại các lần nhấn phím (như mũi tên lên). Tôi đã tạo ra một Bàn phím mức thấp Hook có nghĩa vụ phải nắm bắt tất cả các phím bấm trong bất kỳ chủ đề nào và gọi hàm gọi lại của tôi, nhưng nó không hoạt động. Các chương trình quầy hàng một chút khi tôi nhấn một phím, nhưng không bao giờ gọi lại gọi lại. Tôi đã kiểm tra tài liệu nhưng chưa tìm thấy gì cả. Tôi không biết liệu tôi có đang sử dụng SetWindowsHookEx() không chính xác (với kiến ​​thức của tôi nó tạo thành công móc) hay hàm gọi lại của tôi không chính xác! Tôi không chắc chắn những gì sai! Xin được cảm ơn trước về sự giúp đỡ.C++ SetWindowsHookEx WH_KEYBOARD_LL Thiết lập đúng

#include "Windows.h" 
#include <iostream> 
using namespace std; 

HHOOK hookHandle; 

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam); 

int _tmain(int argc, _TCHAR* argv[]) { 

hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0); 

if(hookHandle == NULL) { 
    cout << "ERROR CREATING HOOK: "; 
    cout << GetLastError() << endl; 
    getchar(); 
    return 0; 
} 

MSG message; 

while(GetMessage(&message, NULL, 0, 0) != 0) { 
    TranslateMessage(&message); 
    DispatchMessage(&message); 
} 

cout << "Press any key to quit..."; 
getchar(); 

UnhookWindowsHookEx(hookHandle); 

return 0; 
} 


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) { 
cout << "Hello!" << endl; 

// Checks whether params contain action about keystroke 
if(nCode == HC_ACTION) { 
    cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl; 
} 

return CallNextHookEx(hookHandle, nCode, 
      wParam, lParam); 
} 
+0

Vui lòng xem [ở đây] (http://stackoverflow.com/questions/2127112/global-keyboard-hook-not-working/2127292 # 2127292) cho một câu hỏi tương tự, mà tôi đã trả lời sẽ giúp bạn. – t0mm13b

Trả lời

2

Bạn không thể chặn trên syscall (getchar), bạn phải chạy vòng lặp cửa sổ và xử lý thư trước khi móc được gọi.

+0

Làm cách nào để triển khai vòng lặp cửa sổ? Tôi rất không quen thuộc với WinAPIs (trên thực tế whats mục đích của một vòng lặp cửa sổ?) – Mahir

+0

http://msdn.microsoft.com/en-us/library/aa383682(VS.85).aspx là một ví dụ tốt –

+0

Cảm ơn , Tôi sẽ đăng lại sau vài phút nếu tôi vẫn gặp sự cố. – Mahir

0

Trên Windows XP, bạn cần, bạn cần phải vượt qua hInstance (từ WinMain) làm đối số thứ ba cho SetWindowsHookEx. Ví dụ:

int WINAPI WinMain 
(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, int nCmdShow) { 

    hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, hInstance, 0); 

// ... 
0

Tôi đề xuất mô phỏng trước;

// VB: Lấy trường hợp ứng dụng HINSTANCE appInstance = GetModuleHandle (NULL);

và sau đó: hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ..., nhưng có những lỗi khác sau đó, quá

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