2012-10-13 17 views
0

要記錄的關鍵水龍頭我安裝鉤子爲:獲得與鍵水龍頭沿着「應用程序的名稱」

BOOL WINAPI installHook(HINSTANCE hinstDLL, DWORD fwdReason, LPVOID lpvReserved) { 
handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstDLL, 0); 
MSG msg; 

while(GetMessage(&msg, NULL, 0, 0)){ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
return msg.wParam; 
} 

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    // write here 
} 

有沒有什麼方法可以讓我知道那裏的鑰匙,目前正在應用程序的名稱挖掘?就像我打開記事本寫了一些東西,我可以得到記事本的應用程序的名稱以及關鍵的水龍頭嗎?同樣的一些其他應用程序,如Mozilla Firefox。

回答

2

你的針鉤的內部看起來應該像這樣:

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    // if it is not a keydown event, continue the chain 
    if(HC_ACTION != nCode || WM_KEYDOWN != wParam) 
     return CallNextHookEx(0, nCode, wParam, lParam); 

    const KBDLLHOOKSTRUCT* messageInfo = reinterpret_cast<const KBDLLHOOKSTRUCT*>(lParam); 

    // add more code here... 

    // tell Windows we processed the hook 
    return 1; 
} 

messageinfo.vkCode將包含你尋找的關鍵代碼。這些代碼的官方列表是:http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

鍵通常被輸入到前臺窗口(雖然有時會出現奇怪的窗口布局)。你可以得到前臺窗口的這樣的標題:

TCHAR title[100]; // increase size for longer titles 
GetWindowText(GetForegroundWindow(), title, 100); 

如果你想獲得該程序的名稱,而不是使用:

TCHAR title[100]; // increase size for longer program names 
GetWindowModuleFileName(GetForegroundWindow(), title, 100); 

而且,記得要加錯誤檢查和檢查文檔。

+1

+1我不知道他們將'GetWindowModuleFileName'合爲一體。不過,我認爲焦點(因爲這是擊鍵的位置)而不是前景窗口更貼近窗口。 – chris