как использовать my_getch в С++?

Я создал похожую на 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;}    

person Community    schedule 21.08.2017    source источник
comment
Что вы хотите, чтобы он делал?   -  person    schedule 21.08.2017
comment
Я не знаю, как обстоят дела с консольными приложениями и циклами сообщений, но в документации довольно ясно, что GetKeyState не работает в реальном времени. Я определенно мог видеть горячую петлю, препятствующую обновлению состояния.   -  person chris    schedule 21.08.2017
comment
Беглый взгляд на документацию показывает, что вам, вероятно, следует использовать GetAsyncKeyState   -  person scohe001    schedule 21.08.2017


Ответы (1)


Глядя на документы для GetKeyState< /а>:

Состояние ключа, возвращаемое этой функцией, изменяется по мере того, как поток считывает ключевые сообщения из своей очереди сообщений. Состояние не отражает состояние уровня прерывания, связанного с оборудованием. Используйте функцию GetAsyncKeyState для получения этой информации.

Это говорит о том, что вы должны использовать GetAsyncKeyState вместо этого. Из документов:

Определяет, была ли клавиша нажата или нажата во время вызова функции и была ли клавиша нажата после предыдущего вызова GetAsyncKeyState.

person scohe001    schedule 21.08.2017
comment
@RoyAviDan Что это значит? Что случилось? - person scohe001; 21.08.2017
comment
та же проблема - person ; 22.08.2017
comment
Я наверное не понял как им пользоваться - person ; 22.08.2017