[英]Low-Level C++ App Crashes on Windows Vista/7 Unless Run in XP Compatibility Mode
[英]How can I access a low-level hardware I/O functions in C++ on Windows?
我正在用C ++編寫游戲,我需要檢測用戶何時按下某個鍵。 通常,我會使用std::cin
,但我有一個圖形窗口,使用graphics.h
,這是一個最初由古老的Borland Turbo C ++編譯器提供的標題,但在線提供了一個等效的標題。 所以,我會使用函數inportb();
,具有如下函數定義:
inline unsigned char inportb(unsigned int port) {
unsigned char ret;
asm volatile ("inb %%dx,%%al":"=a"(ret):"d"(port));
return ret;
}
來源: inportb 。
但在Windows中,像這樣的直接低級硬件I / O受到保護,如果嘗試,則程序將被終止。 所以我需要通過高級函數或API訪問該函數。
我的問題:我怎么能這樣做?
如果您試圖在游戲循環中間檢測特定鍵的狀態,則GetAsyncKeyState將確定此時的特定狀態。
if (GetAsyncKeyState(VK_LEFT) & 0x8000) != 0u)
{
// ...
}
此函數采用虛擬鍵代碼(在本例中為左箭頭鍵),獲取狀態,並在按位AND操作后確定鍵是否已關閉,然后關閉。
這些虛擬鍵代碼可以在WinUser.h中找到。 GetAsyncKeyState與GetKeyState的不同之處在於GetKeyState不反映與硬件關聯的中斷級狀態(這就是我之前使用GetAsyncKeyState的原因)。 如果您需要給定實例的所有關鍵狀態(很少見),請考慮GetKeybardState 。
但是,如果要等待鍵事件( WM_KEYDOWN , WM_CHAR , WM_KEYUP ),則必須在窗口過程中提供一個案例來處理該事件。
LRESULT WindowProc(UINT const message, WPARAM const wparam, LPARAM const lparam)
{
switch(message)
{
// [ cases like WM_CREATE / WM_PAINT / WM_CLOSE / WM_DESTROY ]
case WM_KEYDOWN:
// handle event here
break;
case WM_CHAR:
// handle event here
break;
case WM_KEYUP:
// handle event here
break;
}
}
希望這可以幫助。
在Windows中有4種不同的方法來檢測輸入。
幾十年前,我對Turbo C ++有很多樂趣:-)但如果我是你,我會嘗試使用除C編譯器之外的游戲引擎或lib,例如這個SDL或Ogre(參見https:// en.wikipedia.org/wiki/List_of_game_engines一個太長的名單)。
它們提供(除其他外)具有鍵盤事件的事件循環。
或者更少,您可能希望使用Windows或跨平台框架,例如Microsoft提供的MSVC(某些用途是免費的)或Qt(更加免費,現在附帶一個方便的IDE)。
玩得開心,給別人帶來樂趣!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.