如何在C++中使用my_getch?
问题描述:
我使用windows.h-GetKeyState创建了一个getch-like函数,它运行良好,但是当我在循环中执行时,它获得了相同的字符数。我该怎么办?如何在C++中使用my_getch?
我使用的是gcc 4.9.2代码块windows 10。
我的代码是:
#include <windows.h>
#include <iostream>
bool pressed(int key){return GetKeyState(key)&0x8000;}
int my_getch(){
while(true){
bool shift=pressed(VK_SHIFT);
for(char a='A'; a<='Z'; a++) if(pressed(a)) return shift||GetKeyState(VK_CAPITAL)?a:a-'A'+'a';
if(pressed(VK_OEM_3)) return shift?'~':'`';
if(pressed(VK_OEM_4)) return shift?'{':'[';
if(pressed(VK_OEM_6)) return shift?'}':']';
if(pressed(VK_OEM_5)) return shift?'|':'\\';
if(pressed(VK_OEM_1)) return shift?':':';';
if(pressed(VK_OEM_7)) return shift?'"':'\'';
if(pressed(VK_OEM_COMMA)) return shift?'<':',';
if(pressed(VK_OEM_PERIOD)) return shift?'>':'.';
if(pressed(VK_OEM_2)) return shift?'?':'/';
if(pressed('1')) return shift?'!':'1';
if(pressed('2')) return shift?'@':'2';
if(pressed('3')) return shift?'#':'3';
if(pressed('4')) return shift?'$':'4';
if(pressed('5')) return shift?'%':'5';
if(pressed('6')) return shift?'^':'6';
if(pressed('7')) return shift?'&':'7';
if(pressed('8')) return shift?'*':'8';
if(pressed('9')) return shift?'(':'9';
if(pressed('0')) return shift?')':'0';
if(pressed(VK_OEM_MINUS)) return shift?'_':'-';
if(pressed(VK_OEM_PLUS)) return shift?'+':'=';
if(pressed('\b')) return '\b';
if(pressed(VK_DIVIDE)) return '/';
if(pressed(VK_MULTIPLY)) return '*';
if(pressed(VK_ADD)) return '+';
if(pressed(VK_SUBTRACT)) return '-';
if(pressed('\t')) return '\t';
if(pressed(' ')) return ' ';
for(int i=VK_NUMPAD0; i<=VK_NUMPAD9; i++) if(pressed(i)) return i-VK_NUMPAD0+'0';
if(pressed(VK_DECIMAL)) return '.';
if(pressed('\r')) return '\n';
}
}
int WinMain(HINSTANCE, HINSTANCE, char*, int){
while(true) std::cout<<my_getch()<<'\r';
return 0;}
答
在文档寻找GetKeyState:
密钥状态从这个函数返回的变化作为一个线程读取从消息队列中的关键信息。状态并不反映与硬件相关的中断级别状态。使用GetAsyncKeyState函数检索该信息。
这表明您应该使用GetAsyncKeyState来代替。来自文档:
确定在调用该函数时是否启用或关闭某个键,以及在先前调用GetAsyncKeyState后是否按下该键。
你想干什么? –
我不知道在控制台应用程序和消息循环中情况如何,但文档很清楚GetKeyState并不是实时的。我当然可以看到一个防止状态被更新的热循环。 – chris
快速浏览文档显示您应该使用['GetAsyncKeyState'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v = vs.85).aspx) – scohe001