c++ - 无法使用 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
函数输入以下参数:
- '的 ASCII 码 ' , 即 59
- 这 ';' 特点
- VK_OEM_1 - 虚拟密钥
- 0xBA - 十六进制的虚拟键值
- 186,正如我在这里找到的:https ://www.amibroker.com/guide/afl/getasynckeystate.html 。
当 ' ;时,没有任何参数使函数返回 -32767 '键被按下。
您是否知道我应该如何使用该功能来捕获该键以及因此我的方法未捕获的所有其他键([ ] \ / ?“ ' .)?
PS:我使用的是标准的英语(美国)键盘布局。
提前致谢!
解决方案
我找到了解决方案。当您从屏幕上隐藏控制台时,似乎 Visual Studio 会发疯(就像您更改了代码中的某些内容,但是当您再次运行应用程序时,更改不会传播)。
但是,我想与您分享一些可能导致我遇到的错误的错误:
- 如果您使用
char
变量来存储 ASCII 码,对于某些键,它可能会超过最大char
大小,因此我建议使用 anunsigned char
或 anint
。 - 如果您计划遍历所有可能的 ASCII 代码列表,请尝试增加扩展 ASCII 表的大小。不限于标准之一。
以下是有关可能对您有所帮助的问题的相应代码片段:
int main()
{
while (1){
for (unsigned char i = 0; i < 255; i++){
if (GetAsyncKeyState(i) == -32767) {
if (i == VK_OEM_1) {
cout << ";";
}
}
// ....
}
}
}
推荐阅读
- python - 如何在另一个任务旁边运行 tkinter 的 after event?
- c++ - 是否可以在 win32 或 MFC 应用程序中从 Windows 获取“磁盘空间不足”通知?
- c# - DotNetCore3.0 WPF - error - Project file is incomplete. Expected imports are missing
- ruby-on-rails - 参数未提交
- python - pickle.load() 给出错误“初始化字符串太小”
- git - 处理功能分支,提交代码但由于测试失败而从未推送。在本地删除存储库,重新克隆存储库
- css - sass-loader 不生成 CSS
- firebase - ScopedModel 与 Firestore 添加重复记录
- excel - VBA 将公式转换为注释
- reactjs - 使用 react 与 angular 构建 ionic 4 应用程序之间的性能差异