【发布时间】:2019-03-15 19:17:44
【问题描述】:
VBA 代码“WaitUntilF9Key”检测到“F9”键被按下时按下,直到它被按下。 “WaitUntilLButton”会立即触发,而不是在按下左键盘按钮时触发。为什么会这样? tkx
Option Compare Database
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_LBUTTON = &H1
Public Const VK_RBUTTON = &H2
Private Const VK_F9 = &H78
Sub WaitUntilF9Key()
Do Until GetAsyncKeyState(VK_F9)
DoEvents
Loop
MsgBox ("Ta Da")
End Sub
Sub WaitUntilLButton()
Do Until GetAsyncKeyState(VK_LBUTTON)
DoEvents
Loop
MsgBox ("Ta Da")
End Sub
【问题讨论】:
-
像这样的忙循环并不是一个理想的方法。考虑实现子类化回调......无论你需要什么。
-
您错误地使用了GetAsyncKeyState - 它不能像您的循环条件所暗示的那样安全地转换为
Boolean- 您实际上必须解释 值。来自文档:“如果设置了最高有效位,则键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 后按下了键。” -
感谢 Comintern 2 和 Mathiew Guidon 2。我感谢文档对操作和返回值的详细说明。我仍然不明白为什么不同的关键代码之间存在差异。我已经给出了让用户与键盘交互的方法之一,即检测屏幕上图案的位置并启动键状态的更改,即在该位置处的 mouseLeftdown - 这可能也不明显。欢迎评论。