C++ 切换键/c++;

C++ 切换键/c++;,c++,winapi,keyboard,C++,Winapi,Keyboard,我尝试注册是否已按如下方式打开或关闭某个键: if (pKeyBuffer[VK_TAB] & 0xFF81) { functionA(); } if (pKeyBuffer[VK_TAB] & 1) { functionB(); } if( IsKeyDown(VK_TAB) ) { // The key is currently down } else { // The key is currently up } 但是在上面的代码中有一个很大

我尝试注册是否已按如下方式打开或关闭某个键:

if (pKeyBuffer[VK_TAB] & 0xFF81)
{
   functionA();
}

if (pKeyBuffer[VK_TAB] & 1)
{
   functionB();
}
if( IsKeyDown(VK_TAB) )
{
    // The key is currently down
}
else
{
    // The key is currently up
}
但是在上面的代码中有一个很大的问题——VK_选项卡的状态在启动时是未知的,因此,有时,我不得不在运行时再次按TAB键将其设置为默认状态

我不能使用常规的“0xF0”或“0”,因为我负担不起多次调用
function()
functionB()
。我需要类似开关的行为(即,如果按下Tab键,即使按下它,
function()
仍然只执行一次)


那么,有没有办法获得键状态信息来执行第一次击键?或者你可以建议一些替代方法?谢谢大家!

在这种情况下,如果您想使用该功能,则在调用给定键时,将获得按键和按键切换信息


因此,如果要检查tab是否被按下,请使用
GetKeyState(VK_tab)&0x8000
,如果要检查其是否被切换,请使用
GetKeyState(VK_tab)&1

在这种情况下,如果要使用该函数,将在调用给定键时获得按键和按键切换信息

因此,如果您想检查tab是否被按下,请使用
GetKeyState(VK_-tab)&0x8000
,如果您想检查它是否被切换,请使用所需的
GetKeyState(VK_-tab)&1

。定义一个函数:

bool IsKeyDown( int vk )
{
    return (GetAsyncKeyState(VK_TAB) & 0x8000) != 0;
}
然后像这样使用:

if (pKeyBuffer[VK_TAB] & 0xFF81)
{
   functionA();
}

if (pKeyBuffer[VK_TAB] & 1)
{
   functionB();
}
if( IsKeyDown(VK_TAB) )
{
    // The key is currently down
}
else
{
    // The key is currently up
}
如果您想准确捕捉关键状态的变化,您需要使用。

您需要。定义一个函数:

bool IsKeyDown( int vk )
{
    return (GetAsyncKeyState(VK_TAB) & 0x8000) != 0;
}
然后像这样使用:

if (pKeyBuffer[VK_TAB] & 0xFF81)
{
   functionA();
}

if (pKeyBuffer[VK_TAB] & 1)
{
   functionB();
}
if( IsKeyDown(VK_TAB) )
{
    // The key is currently down
}
else
{
    // The key is currently up
}

如果你想精确地捕捉关键状态的变化,你需要使用。

你能提供一个例子吗?@Abdulali:它的用法非常简单,但我还是添加了一些例子(在MSDN链接中的例子之上…
GetKeyState()
将不起作用:
当线程从其消息队列读取密钥消息时,此函数返回的密钥状态将发生变化。该状态不反映与硬件相关的中断级别状态。使用GetAsyncKeyState函数来检索该信息。
来自备注部分。@MD.Unicorn:这只是意味着您需要一个消息泵来捕获输入,因此除非用户在创建窗口之前正在做一些事情,否则它不会像这样工作:
如果((GetKeyState(VK_选项卡)&0x0001)!=0)//做点什么
你能提供一个例子吗?@Abdulali:它的用法非常简单,但我还是添加了一些例子(在MSDN链接中的例子之上…
GetKeyState()
将不起作用:
当线程从其消息队列中读取密钥消息时,此函数返回的密钥状态会发生变化。该状态不反映与硬件相关的中断级别状态。使用GetAsyncKeyState函数来检索该信息。
来自备注部分。@MD.Unicorn:这只是意味着您需要一个消息泵来捕获输入,因此除非用户在创建窗口之前正在做一些事情,否则它不会像这样工作:
如果((GetKeyState(VK_选项卡)&0x0001)!=0)//做点什么