我很难理解获取键盘状态的工作原理。我最后一个问题的答案是如此之大,但我无法理解它。
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
答案 0 :(得分: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函数用于应用程序。