簡體   English   中英

如何在Windows上使用C ++訪問低級硬件I / O功能?

[英]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中找到。 GetAsyncKeyStateGetKeyState的不同之處在於GetKeyState不反映與硬件關聯的中斷級狀態(這就是我之前使用GetAsyncKeyState的原因)。 如果您需要給定實例的所有關鍵狀態(很少見),請考慮GetKeybardState

但是,如果要等待鍵事件( WM_KEYDOWNWM_CHARWM_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種不同的方法來檢測輸入。

  1. GetInputState ()(及其周圍的API)(假設您不必支持Windows XP或更低版本)
  2. 您可以使用GetKeyState ()(及其周圍的API)進行輪詢,但是您必須為要檢查的每個鍵進行輪詢。 您可以使用GetInputState()來檢查是否有任何值得檢查的內容,如果有太多的鍵要輪詢。
  3. GetRawInputData ()(及其周圍的API)。 這將在XP中工作,但它是一個更丑陋的界面。 此外,它只會輸入連接到機器的實際硬件。 因此,如果您遠程會話進入Windows機器,它可能無法正常工作。 您還需要了解哪些原始設備連接到系統,找出它們何時連接並找出它們何時分離。 這個(RawInput)API支持所有這些,所以在編寫游戲時你可能會玩得很開心。
  4. Hook函數 ,允許您注冊在發生輸入事件時調用的回調。 掛鈎使用SetWindowsHookEx ()(和周圍的API)注冊。 這是檢測按鍵的最有效但最不可靠的方法。 一些程序可以為相同的事件設置掛鈎,並且API期望每個回調足夠快地返回,以便其他注冊者也可以立即得到通知。 如果你甚至沒有足夠快地返回,你將不會被告知,但你的鈎子函數將不再被調用......即使你取消注冊回調並再次注冊它們也不會。 讓這些工作,並在沒有用戶干預的情況下繼續工作,是優秀鍵盤記錄器的真正藝術出現的地方。

幾十年前,我對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM