2011-07-18 101 views
1

我試圖創建一個快速的代碼,以捕捉的「熱鍵」按鈕,一個在我的平板電腦發出的密鑰序列,並重新設定它的功能。按下按鈕時會發送一個LWin + LCtrl + Tab。低級別的鍵盤鉤子:回調沒有達到

摸索了一段時間後,我決定使用WH_KEYBOARD_LL鉤去嘗試,但幾個小時後,我仍然不能得到掛鉤工作,更不用說實際的功能。

目前,我有以下幾點:

// TestHook2.cpp 

#include "stdafx.h" 

HHOOK hook; 
BOOL gotKey; 
LRESULT WINAPI KeyTrap(int, WPARAM, LPARAM); 
BOOL CtrlHandler(DWORD); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); 
    HMODULE currentProcess = GetModuleHandle(NULL); 
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyTrap, currentProcess, 0); 

    if (!hook) { 
     printf("No hook, quitting!\n"); 
     return 1; 
    } 

    while(1) { 
     if(gotKey) printf("Got Key!\n"); 
     gotKey = FALSE; 
    } 

    return 0; 
} 

LRESULT CALLBACK KeyTrap(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    gotKey = TRUE; 
    return CallNextHookEx(hook, nCode, wParam, lParam); 
} 

BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
    if (fdwCtrlType == CTRL_C_EVENT) 
    { 
     printf("Got CTRL+C, unhooking...\n"); 
     UnhookWindowsHookEx(hook); 
    } 

    return FALSE; 
} 

由SetWindowsHookEx函數返回的句柄,絕對不爲空,但由於某種原因KeyTrap不會被調用,不管我有多少鑰匙試着按可言。我也嘗試將回調放入一個DLL中,並在運行時使用LoadLibrary,但這也給出了完全相同的結果。

我是新來的所有這個Win32編程,所以它可能是一個非常愚蠢的錯誤。

非常感謝! (PS:代碼在Win7上運行,目前沒有訪問實際的鍵盤,但已嘗試通過屏幕鍵盤,遠程(RDP)輸入和平板電腦上的硬件熱鍵生成擊鍵。是問題?)

回答

3

的問題是,您的控制檯應用程序沒有消息循環來處理鉤消息。

用以下替換您while(1)循環,看看是否能工程:

MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) != 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 

     if(gotKey) 
     printf("Got Key!\n");   

     gotKey = FALSE; 
    } 
+0

只是給了這是一個嘗試,它似乎並沒有幫助。 我認爲,通過註冊功能句柄調用SetWindowsHookEx時,Windows會直接調用該函數時引發的事件,所以沒有必要爲一個消息循環?或者我誤解了一些東西? – Saran

+0

您誤解了消息循環是低級別鍵盤掛鉤的硬性要求。當代碼在while(1)循環中燒錄cpu核心時,沒有其他機制可用於調用函數。 –

+0

%的MSDN - 「這個鉤子被稱爲在安裝它的線程的上下文中的呼叫通過發送消息給安裝鉤子的線程發出因此,安裝鉤子必須有消息循環的線程。 「 –