首页 > 解决方案 > 无法使用 GetAsyncKeyState 在 C/C++ 键盘记录器中捕获特殊键

问题描述

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

让我们考虑一下我想捕获; 键。目前,我在无限循环中有以下代码片段:

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 '键被按下。

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

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

提前致谢!

标签: c++keylogger

解决方案


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

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

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

以下是有关可能对您有所帮助的问题的相应代码片段:

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

        // ....
    }
}

}


推荐阅读