如何使用C++编写多个 GetAsyncKeyState

How do I write multiple GetAsyncKeyState with C++

本文关键字:GetAsyncKeyState 何使用 C++      更新时间:2023-10-16

我的问题是我可以在哪里添加这行代码:

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:

几点:

  1. 你确定要像这样投票吗?也许您希望在用户按下这些键(例如WM_KEYDOWN(时响应通知,而不是定期轮询?你的代码有一个问题,如果你在WM_TIMER之间按下并释放F1,它很容易错过。
  2. 你可能应该使用GetKeyState,正如Joachim Pileborg所说。 GetAsyncKeyState 适用于通话时的键盘状态; GetKeyState处理发送当前消息时的键盘状态。这往往会使事情更加紧密地同步。也就是说,如果你在WM_TIMER投票,这可能并不重要。
  3. 您只检查返回值是否为非零值,这不是此函数的工作方式。返回值为位掩码。从文档中:

如果高阶位为 1,则键关闭;否则,密钥为启动。

如果低阶位为 1,则切换密钥。如果某个键(如大写锁定键(处于打开状态,则会切换该键。如果低阶位为 0,则键关闭并取消切换。切换键时,键盘上的切换键指示灯(如果有(将在切换键时亮起,在取消切换键时熄灭。

因此,要检查 F1

if( GetKeyState(VK_F1) & 0x8000 )
{
    ...
}
相关文章:
  • 没有找到相关文章