1. 程式人生 > >64位Win8系統下WinIO的使用 VS2010 驅動級模擬按鍵

64位Win8系統下WinIO的使用 VS2010 驅動級模擬按鍵

使用DirectX介面的遊戲程式,它們在讀取鍵盤操作時繞過了windows的訊息機制,而使用DirectInput.這是因為有些遊戲對實時性控制的要求比較高,比如賽車遊戲,要求以最快速度響應鍵盤輸入。而windows訊息由於是佇列形式的,訊息在傳遞時會有不少延遲,有時1秒鐘也就傳遞十幾條訊息,這個速度達不到遊戲的要求。而DirectInput則繞過了windows訊息,直接與鍵盤驅動程式打交道,效率當然提高了不少。因此也就造成,對這樣的程式無論用PostMessage或者是keybd_event都不會有反應,因為這些函式都在較高層。對於這樣的程式,只好用直接讀寫鍵盤埠的方法來模擬硬體事件了。要用這個方法來模擬鍵盤,需要先了解一下鍵盤程式設計的相關知識。
在DOS時代,當用戶按下或者放開一個鍵時,就會產生一個鍵盤中斷(如果鍵盤中斷是允許的),這樣程式會跳轉到BIOS中的鍵盤中斷處理程式去執行。開啟windows的裝置管理器,可以檢視到鍵盤控制器由兩個埠控制。其中&H60是資料埠,可以讀出鍵盤資料,而&H64是控制埠,用來發出控制訊號。也就是,從&H60號埠可以讀此鍵盤的按鍵資訊,當從這個埠讀取一個位元組,該位元組的低7位就是按鍵的掃描碼,而高1位則表示是按下鍵還是釋放鍵。當按下鍵時,最高位為0,稱為通碼,當釋放鍵時,最高位為1,稱為斷碼。既然從這個埠讀資料可以獲得按鍵資訊,那麼向這個埠寫入資料就可以模擬按鍵了!