如何使用C++编写多个 GetAsyncKeyState
How do I write multiple GetAsyncKeyState with C++
我的问题是我可以在哪里添加这行代码:
if( GetKeyState(VK_F2) & 0x8000 )
我尝试了不同的方法,但是当我编译并运行它并按 F1 或 F2 键时,它会执行所有功能。我想在按下键时调用 F1 键函数,在按下键时调用 F2 键。我正在使用Visual Studio 2010 Express。
这是我的代码:
switch(uMsg)
{
case WM_INITDIALOG:
{
// do something here
break;
}
case WM_TIMER:
{
if( GetKeyState(VK_F1) & 0x8000 )
if( GetKeyState(VK_F2) & 0x8000 )
{
// do something here
}
break;
}
case WM_CLOSE:
{
// do something here
}
}
return 0;
已解决:(好吧,经过一段时间的尝试,我的问题终于解决了,我得到了问题是那个小"中断"语句,请查看代码它的工作完美无缺。非常感谢您的时间和帮助
case WM_TIMER:
{
if(GetKeyState(VK_F1) & 0x8000 )
{
MessageBoxA (NULL, TEXT ("This is a call from F1 key!"), TEXT("Test F1 key"), MB_OK );
}
//break; << this was the one that was giving me the problem
if(GetKeyState(VK_F2) & 0x8000 )
{
MessageBoxA (NULL, TEXT ("This is a call from F2 key!"), TEXT("Test F2 key"), MB_OK );
}
//if(GetKeyState(VK_F3) & 0x8000 ) << i can add multi VK_ keys here
break; // << should be here
}
case WM_CLOSE:
几点:
- 你确定要像这样投票吗?也许您希望在用户按下这些键(例如WM_KEYDOWN(时响应通知,而不是定期轮询?你的代码有一个问题,如果你在
WM_TIMER
之间按下并释放F1,它很容易错过。 - 你可能应该使用
GetKeyState
,正如Joachim Pileborg所说。GetAsyncKeyState
适用于通话时的键盘状态;GetKeyState
处理发送当前消息时的键盘状态。这往往会使事情更加紧密地同步。也就是说,如果你在WM_TIMER
投票,这可能并不重要。 - 您只检查返回值是否为非零值,这不是此函数的工作方式。返回值为位掩码。从文档中:
如果高阶位为 1,则键关闭;否则,密钥为启动。
如果低阶位为 1,则切换密钥。如果某个键(如大写锁定键(处于打开状态,则会切换该键。如果低阶位为 0,则键关闭并取消切换。切换键时,键盘上的切换键指示灯(如果有(将在切换键时亮起,在取消切换键时熄灭。
因此,要检查 F1:
if( GetKeyState(VK_F1) & 0x8000 )
{
...
}
相关文章:
- 没有找到相关文章