如果按住ctrl,GetKeyState不会注册

时间:2017-04-27 14:42:28

标签: winapi visual-c++

鉴于此声明:

if (GetKeyState(VK_CAPITAL) & 0x8000)
{
    cout << "caps lock" << endl;
}

如果我单独按下大写锁定,或者除了 ctrl之外的任何键,它都能正常工作。我在想它是因为ctrl是一个修饰符,但是在保持shift时这很好用。有什么我想念的吗?

1 个答案:

答案 0 :(得分:4)

GetKeyState()提供键盘的同步状态。按下键时所有键的状态。在程序看到它之前可能需要一段时间,Windows提供了预先输入,因此知道所有键的状态是否可以可靠地检测Shift,Alt,Ctrl是否在当时关闭是很重要的。

调用GetMessage()时,同步状态会更新。在Windows程序的样板消息循环中完成。

但是因为你使用cout,你可能写了一个控制台模式程序,根本不使用消息循环。所以它不会更新。而且你必须使用GetAsyncKeyState()。根本没有缓冲,所以你必须经常调用它。请注意,控制台还可以通过retrieve keystrokes支持缓冲。当您编写这样的代码时,您可能真正想要/应该做的事情。注意输入重定向。