2014-05-19 38 views
0

我很努力去理解獲取鍵盤狀態是如何工作的。關於我最後一個問題的答案非常棒,但我無法讓自己的頭轉向它。VBA GetKeyboardState的使用 - 不能讓我的頭轉過來

Trying to capture key press while sub running (for snake game) VBA

我已經宣佈的功能(並用PTRSAFE),但我不能看到它下面的代碼使用。我已經嘗試製作一個小組,但我不明白將要發生什麼?有人可以向我解釋。我可以看到它檢查從0到255,但不知道它是如何與函數相關來獲得狀態?

Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long 

dim keybrdbuff(255) as byte 

For x = 0 to 255 
    If 0<>keybrdbuff(x) then Exit Sub 
Next 

回答

2

如果任何256個虛擬鍵被按下那麼它是不是0。如果不爲0則退出子,放棄你的移動休息。 Windows會以正常的方式將密鑰發送到窗口,並且您的程序將正常處理它。

你必須運行for循環,無論你想中止其餘的動作。

GetKeyboardState功能


的GetKeyboardState功能拷貝256個的虛擬鍵映射到指定緩衝器的狀態。

語法

BOOL GetKeyboardState(   PBYTE lpKeyState 
); 

參數

lpKeyState [in]指向接收用於每個虛擬鍵的狀態數據256字節數組。 返回值

如果函數成功,則返回值爲非零。

如果函數失敗,返回值爲零。要獲得擴展的錯誤信息,請調用GetLastError。

備註

應用程序可以調用這個函數來獲取所有的虛擬鍵的當前狀態。狀態隨着線程從其消息隊列中移除鍵盤消息而改變。當鍵盤消息被髮布到線程的消息隊列時,狀態不會改變,也不會隨着鍵盤消息被髮布到其他線程的消息隊列或從其他線程的消息隊列中檢索到而改變。 (例外:通過AttachThreadInput連接的線程共享相同的鍵盤狀態。)

當函數返回時,由lpKeyState參數指向的數組的每個成員都包含虛擬鍵的狀態數據。如果高位爲1,則密鑰關閉;否則,它已經到了。如果鍵是一個切換鍵,例如CAPS LOCK,則當鍵被切換時,低位爲1,如果鍵未被切換,則爲0。對於非切換鍵,低位是沒有意義的。據說切換鍵在打開時被切換。當鍵被切換時,鍵盤上的切換鍵指示燈(如果有的話)將會亮起,而當鍵未被切換時則會熄滅。

要檢索單個密鑰的狀態信息,請使用GetKeyState函數。要檢索單個鍵的當前狀態,而不管相應的鍵盤消息是否已從消息隊列中檢索到,請使用GetAsyncKeyState函數。

應用程序可以使用虛擬鍵碼常量VK_SHIFT,VK_CONTROL和VK_MENU作爲指向由lpKeyState指向的數組的索引。這給出了SHIFT,CTRL或ALT鍵的狀態,而無需區分左側和右側。應用程序也可以使用下面的虛擬鍵碼常量作爲指標對這些密鑰的左和右實例之間區別:

VK_LSHIFT 
VK_RSHIFT 
VK_LCONTROL 
VK_RCONTROL 
VK_LMENU 
VK_RMENU 

這些左和右區分常數可僅通過GetKeyboardState應用,SetKeyboardState,GetAsyncKeyState,GetKeyState和MapVirtualKey函數。

相關問題