我使用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並不是實時的。我當然可以看到一個防止狀態被更新的熱循環。 – chris
快速瀏覽文檔顯示您應該使用['GetAsyncKeyState'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v = vs.85).aspx) – scohe001