在C和Win32 api中轮询键盘

时间:2017-05-11 20:15:25

标签: c winapi

这段代码没有做它应该做的事情。

enter image description here

当我按下光标键一次时,菜单会多次跳转。

我该如何解决这个问题?

相关源代码

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath 
indexPath: NSIndexPath) -> CGFloat {
  return view.frame.width / CGFloat(aspectRatio)
}

价:

https://sourceforge.net/projects/conio/

1 个答案:

答案 0 :(得分:2)

你有一个软件反弹。

从Microsoft页面。 GetAsyncKeyState

确定在调用函数时键是向上还是向下,以及在上次调用GetAsyncKeyState之后是否按下了键。

函数返回提供两条信息:
1.钥匙的瞬时状态。
2.密钥的历史状态(自上次呼叫以来) 您应该了解并使用它们来做出决定。

要防止弹跳,请查看返回值的说明:

  

如果函数成功,返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及是否   密钥当前上升或下降。 如果最重要的是   设置,键已关闭 ,如果 设置了最低有效位,   在上次调用 之后按下了键以GetAsyncKeyState。   但是,你不应该依赖这最后的行为;更多   信息,请参阅备注。 [emhpasis mine]

例如,您可以专门为每个条件编写函数:

BOOL IsKeyPressed(KEY_CODE key)
{
    if(0x80000000 & GetAsyncKeyState(key))//most significant bit is high
    return TRUE;                          //key IS down
    else return FALSE;
} 

BOOL WasKeyDown(KEY_CODE key)
{
    if(0x00000001 & GetAsyncKeyState(key))//least significant bit is high
    return TRUE;                          //key WAS down
    else return FALSE;
} 

如果在监视多次按键的同时查看历史记录当前状态可能会变得必要,此示例说明了如何执行此操作。特别是,此代码定义了一组可用于终止应用程序的密钥:

void KillThisApp(void)
{
    if ((0x80000000 & GetAsyncKeyState(VK_CONTROL)) || 
        (0x00000001 & GetAsyncKeyState(VK_CONTROL))) 
    {
        if ((0x80000000 & GetAsyncKeyState('k')) || 
            (0x00000001 & GetAsyncKeyState('k')) ||
            (0x80000000 & GetAsyncKeyState('K')) ||
            (0x00000001 & GetAsyncKeyState('K')) ) 
        {
            if((0x80000000 & GetAsyncKeyState(VK_SHIFT)) || 
               (0x00000001 & GetAsyncKeyState(VK_SHIFT)))
            {    
                gRunning = FALSE;
            }
        }
    }
}

这个版本并不关心密钥是否已关闭,或 是否已关闭,但可以轻松编辑以确保所有密钥在关闭时都已关闭通过在每次通话期间仅查看高位来计算