【问题标题】:Problems with KBDLL hookingKBDLL 挂钩问题
【发布时间】:2016-05-23 16:34:37
【问题描述】:

我正在尝试构建自己的键盘记录器(私人/教育)来扩展我的技能。 我开始研究钩子,在这种情况下是 KBDLLHOOKSTRUCT。

我不确定我的代码有什么问题,但它不起作用。 我要做的是:

  • 使用 nCode、wParam 和 lParam 以及对 CallNextHookEx 的返回创建回调函数。

  • 我使用 SetWindowsHookEx 在 HHOOK 句柄中设置了函数,并进入了无限循环。我的 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 增量。

因此我来这里寻求帮助。我可以做些什么来解决我的问题?

【问题讨论】:

标签: c++ winapi hook


【解决方案1】:

您需要阅读文档。直接来自LowLevelKeyboardProc

这个钩子在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。 因此,安装钩子的线程必须有消息循环。

【讨论】:

  • 感谢您的回复。你能给我指个方向吗?我已将 while(true){ } 循环更改为消息循环,但它仅在我将消息框添加到回调函数时才有效。而且我宁愿在每个键之后都不会弹出一个消息框。我可以使用哪些不同类型的“消息”?我试过 SendMessage(HWND_BROADCAST, NULL, wP, lP) 但没有任何反应。
  • @Flinzy:您所需要的只是一个标准的消息循环(没有任何过滤器)。有关示例,请参见 Using Messages and Message Queues
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多