Я создал похожую на getch функцию, используя windows.h-GetKeyState, и она работает хорошо, но когда я делаю это в циклах, она много раз получает один и тот же символ. что мне делать?
Я использую кодовые блоки 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
не работает в реальном времени. Я определенно мог видеть горячую петлю, препятствующую обновлению состояния. - person chris   schedule 21.08.2017GetAsyncKeyState
- person scohe001   schedule 21.08.2017