2017-08-21 31 views
0

我使用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;}  
+0

你想幹什麼? –

+1

我不知道在控制檯應用程序和消息循環中情況如何,但文檔很清楚GetKeyState並不是實時的。我當然可以看到一個防止狀態被更新的熱循環。 – chris

+0

快速瀏覽文檔顯示您應該使用['GetAsyncKeyState'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v = vs.85).aspx) – scohe001

回答

0

在文檔尋找GetKeyState

密鑰狀態從這個函數返回的變化作爲一個線程讀取從消息隊列中的關鍵信息。狀態並不反映與硬件相關的中斷級別狀態。使用GetAsyncKeyState函數檢索該信息。

這表明您應該使用GetAsyncKeyState來代替。來自文檔:

確定在調用該函數時是否啓用或關閉某個鍵,以及在先前調用GetAsyncKeyState後是否按下該鍵。

+0

它不適合我。 – RoyAviDan

+0

@RoyAviDan這是什麼意思?發生了什麼? – scohe001

+0

同樣的問題 – RoyAviDan