【问题标题】:Processing All Keyboard Inputs (Hooks)处理所有键盘输入(挂钩)
【发布时间】:2011-02-04 03:38:11
【问题描述】:

我正在制作一个记录所有键盘操作的程序,并将这些信息存储到日志文件(键盘记录器)中。我似乎找不到这样做的好方法。

到目前为止我所拥有的:一个 LowLevelKeyboardProc,虚拟键码 + 被按下键的扫描码。

我想要什么:使用这些代码,我将处理和写入有关正在完成的键盘操作的信息。对于不可见键,我想要格式:"[SHIFT]、[ENTER]、[ESC] 等。 对于可见键,我只想要它们的 Ascii 值(大写和小写) ),包括如果他们输入:!@#$% 等

我有一些想法,但我不知道如何才能捕捉到所有内容。我有信息,只是不知道如何有效地处理它。

【问题讨论】:

    标签: c++ winapi hook virtual keylogger


    【解决方案1】:

    从这里参考我的帖子:Other Post

    我有关于如何安装低级键盘挂钩以及如何处理击键的示例代码。

    【讨论】:

    • 我无法完全理解 C#。你能用通俗的话解释一下吗?:你对 hookproc 等的值做了什么
    • @Logostic:不要难过,因为那是汇编,而不是 C#。
    【解决方案2】:

    既然你已经让钩子工作了,你所需要的只是一个从键码到特殊键名的映射。只需预先填充一个由关键代码索引的字符串数组:

    const char *map[256];
    
    map[VK_SHIFT] = "[SHIFT]";
    map[VK_ENTER] = "[ENTER]";
    ...
    

    然后在你的钩子函数中,检查键是否是可打印字符,如果是,则直接打印,否则查找键的名称并打印:

    if (isprint(vkCode))
      yourFile << char(vkCode);
    else
      yourFile << map[vkCode];
    

    【讨论】:

    • “错误:“map[VK_SHIFT] = "[SHIFT]";" 行上的 '=' 标记之前的预期构造函数、析构函数或类型转换。我错过了什么不是吗?
    • @Logostic:可能标识符mapstd::map 容器冲突。尝试使用其他名称。
    • 我改了名字,同样的问题。
    • @Logostic:对我来说效果很好。您在哪里输入此代码?
    • 我在全球范围内使用它,并尝试添加“public”,但这也不起作用。我不想把它写在我的 hookproc 中,因为它不会导致它们每次都被声明吗?
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多