无法使用 GetAsyncKeyState 在 C/C++ 键盘记录器中捕获特殊键
Cannot capture special keys in C/C++ keylogger using GetAsyncKeyState
我在 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 文档中所述:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes。
据我所知,GetAsyncKeyState
功能 returns -32767 在一个键刚被释放之后。
上面的代码适用于其他虚拟键或简单键,如 ASCII table 中所述(例如 GetAsyncKeyState(48)
适用于 0 键, GetAsyncKeyState(VK_RETURN)
适用于 ENTER 键等。
我已经尝试为 GetAsyncKeyState
函数输入以下参数:
- ';' 的 ASCII 码,即 59
- ';'字符
- VK_OEM_1 - 虚拟键
- 0xBA - 十六进制的虚拟键值
- 186,正如我在这里找到的那样:https://www.amibroker.com/guide/afl/getasynckeystate.html。
当按下“;”键时,参数的 None 使函数 return -32767。
您是否知道我应该如何使用该函数来捕获该键以及我的方法未捕获的所有其他键 ([ ] \ / ?" '.)?
P.S:我使用的是标准英语(美国)键盘布局。
提前致谢!
我找到了解决办法。当您从屏幕上隐藏控制台时,似乎 Visual Studio 变得疯狂(就像您更改了代码中的某些内容,但是当您再次 运行 应用程序时,更改不会传播)。
但是,我想与您分享一些可能导致我遇到的错误的错误:
- 如果你使用
char
变量来存储ASCII码,对于某些键它可能会超过最大char
大小,因此我建议使用unsigned char
或int
。
- 如果您打算遍历所有可能的 ASCII 代码列表,请尝试增加扩展 ASCII 的大小 table。不要局限于标准的。
以下是可能对您有所帮助的问题的相应代码片段:
int main()
{
while (1){
for (unsigned char i = 0; i < 255; i++){
if (GetAsyncKeyState(i) == -32767) {
if (i == VK_OEM_1) {
cout << ";";
}
}
// ....
}
}
}
我在 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 文档中所述:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes。
据我所知,GetAsyncKeyState
功能 returns -32767 在一个键刚被释放之后。
上面的代码适用于其他虚拟键或简单键,如 ASCII table 中所述(例如 GetAsyncKeyState(48)
适用于 0 键, GetAsyncKeyState(VK_RETURN)
适用于 ENTER 键等。
我已经尝试为 GetAsyncKeyState
函数输入以下参数:
- ';' 的 ASCII 码,即 59
- ';'字符
- VK_OEM_1 - 虚拟键
- 0xBA - 十六进制的虚拟键值
- 186,正如我在这里找到的那样:https://www.amibroker.com/guide/afl/getasynckeystate.html。
None 使函数 return -32767。
您是否知道我应该如何使用该函数来捕获该键以及我的方法未捕获的所有其他键 ([ ] \ / ?" '.)?
P.S:我使用的是标准英语(美国)键盘布局。
提前致谢!
我找到了解决办法。当您从屏幕上隐藏控制台时,似乎 Visual Studio 变得疯狂(就像您更改了代码中的某些内容,但是当您再次 运行 应用程序时,更改不会传播)。
但是,我想与您分享一些可能导致我遇到的错误的错误:
- 如果你使用
char
变量来存储ASCII码,对于某些键它可能会超过最大char
大小,因此我建议使用unsigned char
或int
。 - 如果您打算遍历所有可能的 ASCII 代码列表,请尝试增加扩展 ASCII 的大小 table。不要局限于标准的。
以下是可能对您有所帮助的问题的相应代码片段:
int main()
{
while (1){
for (unsigned char i = 0; i < 255; i++){
if (GetAsyncKeyState(i) == -32767) {
if (i == VK_OEM_1) {
cout << ";";
}
}
// ....
}
}
}