VBA F9 按钮已识别 鼠标左键未识别

Posted

技术标签:

【中文标题】VBA F9 按钮已识别 鼠标左键未识别【英文标题】:VBA F9 Button recognized left mouse button not recognized 【发布时间】: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 - 这可能也不明显。欢迎评论。 【参考方案1】:

GetAsyncKeyState 返回一个字节,而不是布尔值。您需要使用您正在寻找的位“和”它以获得有意义的结果。

在您的情况下,您想要的位是 &H8000。来自 GetAsyncKeyState 的微软文档:

如果设置了返回值的&H8000位,则自上次调用GetAsyncKeyState的线程以来至少按下了一次键

Sub WaitUntilF9Key()
    Do Until GetAsyncKeyState(VK_F9) And &H8000
        DoEvents
    Loop
    MsgBox ("Ta Da")
End Sub

Sub WaitUntilLButton()
    Do Until GetAsyncKeyState(VK_LBUTTON) And &H8000
        DoEvents
    Loop
    MsgBox ("Ta Da")
End Sub

也就是说,就像其他人提到的那样,如果可能的话,通常应该避免这样的忙循环

【讨论】:

让我想起了 recent question,本质上是在问为什么 Not 1 不是 0,将整数返回值视为布尔值,就像这样。

以上是关于VBA F9 按钮已识别 鼠标左键未识别的主要内容,如果未能解决你的问题,请参考以下文章

如果无法识别,如何在游戏中模拟硬件鼠标点击?

3操作元素:模拟键盘鼠标事件

易语言,怎么对指定窗口模拟鼠标点击和按键,可以后台的

excel表格数据量很大时如何提高vba的效率

鼠标按下或基于鼠标按钮更新控制光标

delphi 模拟键盘法对当前窗口鼠标左键单击最小化怎么做?