使用GetAsyncKeyState()的密钥侦听器/记录器
Key listener / logger using GetAsyncKeyState()
我看到很多人都可以使用for循环来确定按下的键的值,例如它将是GetAsyncKeyState(41(,因此他们可以很容易地使用循环,但出于某种原因,只有当我键入GetAsyncKeyState(0x41(等时,它才对我有效,我能对此做些什么吗?这样我就可以循环使用它,而不必单独键入每个值?
int main()
{
while(!GetAsyncKeyState(VK_F8))
{
for(int i=65; i<90; i++)
{
if(GetAsyncKeyState(i))
{
log << "HELLO DER";
}
Sleep(200);
}
}
}
41
和0x41
是两个完全不同的值。第二个0x41
是十进制值65的十六进制,它是"A"的ASCII代码。但我猜您已经知道了,因为您将i
初始化为65(大写ASCII字母和VK代码匹配(。
无论如何,假设您正在尝试记录按键,您的代码在一定程度上几乎可以正常工作。长话短说,你的循环延迟太长了,以至于它无法迭代200ms * 26 = 5.2 seconds
中的每个字符。因此,如果您在5.2秒内键入"AAAB",则只会注册"AB"。但如果延迟时间太短,那么您可能会注册一次以上的按压。
有关详细信息,请阅读GetAsyncKeyState的文档。
无论如何,我可能会选择上面文档备注中提到的不同函数,比如GetKeyboardState,因为你通常会使用GetAsyncKeyState
之类的函数来注册热键或类似的东西。例如,GetAsyncKeyState
非常适合想知道按键是否被按下,而不是按下了多少次、按下的顺序等。这样的循环似乎真的很容易出现问题。
此外,不要做任何愚蠢的日志键。。。
编辑:实际上GetKeyboardState
仍然不是一个好的解决方案。用SetWindowsHookEx设置键盘挂钩是一个更好的选择。您可以使用WH_KEYBOARD_LL
挂钩类型设置具有LowLevelKeyboardProc回调的低级键盘挂钩。
我在谷歌上搜索了一下,有一个开源的宏程序AutoHotkey使用了这种方法,我想如果你愿意的话,你可以看看。
看看这个。
用法非常简单:
unsigned char kbstate[256];
if(!GetKeyboardState(kbstate))
{
// can not get keyboard state
}else{
for(int i=0; i<256: i++)
{
if(kbstate[i] & 0x1)
{
// the key is pressed, do something
}
}
}
- 如何在没有侦听器的情况下创建 TCP 连接?
- glfw 的基本设置会导致与 emscripten 生成的 js 文件中的事件侦听器有关的运行时错误
- 如何通知侦听器结构的哪个字段已更新
- 通过TCP连接到Wi-Fi上的0.0.0.0,而侦听器PC有活动的Wi-Fi,以太网没有'不起作用
- 如何提高对 std::函数侦听器的分发性能?
- 如何在 TCP 侦听器中处理异步发送和接收
- 从侦听器检索 antlr4 解析器中跳过的空格
- 为什么日食总是发生错误"An internal error occurred during: "通知选择侦听器". java.lang.StackOverflowError"
- 超越Juce ButtonStateChange /侦听器问题
- Qtcpserver 仅在调试器下在侦听函数上返回未知错误
- 微控制器 - 按钮"按住"侦听器
- 从 Objective-c 委派到 c(或者更好地称之为:创建从 C 到 OBJ-C 的侦听器)
- 如何使用 Node.js 开发一个侦听器来接收许多车辆跟踪数据(通过 TCP)
- C++ 套接字侦听器 accept() 在发布时不接受连接请求
- C ++什么设计将有助于避免使用侦听器时的多重继承
- RDP动态虚拟通道 - 创建多个侦听器
- VS2015 中卡萨布兰卡的链接器错误,同时尝试构建一个简单的 HTTP 侦听器
- 侦听器.Accept将错误传递给sf :: tcpsocket时给出错误
- 如何使侦听器可以访问C 中的其他功能
- 使用GetAsyncKeyState()的密钥侦听器/记录器