如何用C ++编写多个GetAsyncKeyState

时间:2014-08-15 08:52:07

标签: c++ windows visual-studio-2010 visual-studio

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

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;

2 个答案:

答案 0 :(得分:1)

已解决:)很好,我的问题在尝试了一段时间后终于解决了问题 是那么小"休息;"声明请查看其完美无瑕的代码。 非常感谢你的时间和帮助赞赏

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 :(得分:0)

几点:

  1. 您确定要这样投票吗?也许你想在用户按下这些键(例如WM_KEYDOWN)而不是定期轮询时响应通知?你的代码有一个问题,如果你按下&amp;在WM_TIMER s。
  2. 之间发布F1
  3. 正如Joachim Pileborg所说,你应该使用GetKeyStateGetAsyncKeyState在通话时处理键盘的状态;当前消息发送时,GetKeyState处理键盘状态。这往往会使事情更紧密地同步。也就是说,如果你在WM_TIMER进行投票,那可能并不重要。
  4. 您只检查返回值是否为非零,这不是此函数的工作方式。返回值是位掩码。来自文档:
  5.   

    如果高位为1,则键为关闭;否则,它就结束了。

         

    如果低位为1,则切换键。如果键打开,则会切换一个键,例如CAPS LOCK键。如果低位为0,则键关闭并取消加盖。当键切换时,键盘上的切换键指示灯(如果有)将打开,而当键未被切换时,键将关闭。

    因此,要检查 F1

    if( GetKeyState(VK_F1) & 0x8000 )
    {
        ...
    }