在 Excel VBA 2013 中获取光标状态

Posted

技术标签:

【中文标题】在 Excel VBA 2013 中获取光标状态【英文标题】:Get cursor state in Excel VBA 2013 【发布时间】:2016-04-20 08:26:12 【问题描述】:

我创建了一个宏来执行一系列鼠标单击和鼠标移动(击键宏)以将重复数据输入 Oracle(程序/数据库)。

我之前使用 Dataload Classic 或 Dataloader Classic(按键程序)将数据输入 Oracle,但它缺少“Smarts”,所以我创建了自己的带有一些“Smarts”的按键程序。

我正在使用 SLEEP 命令/函数在每次鼠标移动和鼠标点击后等待几秒/毫秒。有时 Oracle 会很慢并且“暂停”/“加载”/或“冻结”,冻结时间可能会超过 SLEEP 命令的初始等待时间并继续执行程序,从而将一切搞砸。

示例:

如果发生了什么事情,那么 睡眠 2000 结束如果

在 DataLoad classic/Dataloader Classic 中,有一些选项可以更改每次鼠标单击或鼠标移动等时可以等待/暂停的时间。有一个“沙漏检查”。这表示如果鼠标处于沙漏状态并且用户可以输入毫秒或秒,您可以设置程序等待的时间。

是否有 Excel VBA 代码来检查鼠标的 HOURGLASS 状态?

【问题讨论】:

DoEvents? Another DoEvents Link ... Maybe Better 游标状态是什么意思?它在表中的什么位置?如果加载轮正在运行,那么可能有更好的方法来检测正在发生的事情,而不仅仅是光标动画显示的内容。 我在模块里写,我一直在网上搜索,但我没有找到任何东西。也许我没有在寻找合适的术语@BruceWayne 我们的主要问题是为什么要检查光标以进行某些操作?这听起来像是XY problem。我认为您的“真正”问题是如何确定循环何时完成(鼠标何时不再是沙漏)? 有一个“Application.Cursor”属性。你试过吗?作为测试,例如: If Application.Cursor = xlWait Then MsgBox "foo" 您可能会在“Do While”循环中包装检查。这是 MSDN 文档:msdn.microsoft.com/en-us/library/office/… 【参考方案1】:

您可以尝试以下函数,它使用 win api 函数 LoadCursor 和 GetCursorInfo 来确定当前光标是否等于等待光标。

该函数首先加载 win 预定义的等待游标,然后获取当前游标并检查它们是否相同。高温

Option Explicit

Private Const IDC_WAIT As Long = 32514

Private Type POINT
    x As Long
    y As Long
End Type

Private Type CURSORINFO
    cbSize As Long
    flags As Long
    hCursor As Long
    ptScreenPos As POINT
End Type

Private Declare Function GetCursorInfo _
    Lib "user32" (ByRef pci As CURSORINFO) As Boolean
Private Declare Function LoadCursor _
    Lib "user32" Alias "LoadCursorA" _
    (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long

Public Function IsWaitCursor() As Boolean

    ' Get handle to wait cursor
    Dim handleWaitCursor As Long
    handleWaitCursor = LoadCursor(ByVal 0&, IDC_WAIT)

    Dim pci As CURSORINFO
    pci.cbSize = Len(pci)

    ' Retrieve information about the current cursor
    Dim ret As Boolean
    ret = GetCursorInfo(pci)

    If ret = False Then
        MsgBox "GetCursorInfo failed", vbCritical
        Exit Function
    End If

    ' Returns true when current cursor equals to wait cursor
    IsWaitCursor = (pci.hCursor = handleWaitCursor)

End Function

【讨论】:

【参考方案2】:

如果忙(沙漏),请尝试检查 screen.MousePointer 属性

While screen.MousePointer = 11
      Sleep(500)
Wend

【讨论】:

以上是关于在 Excel VBA 2013 中获取光标状态的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 宏中的数组

在 Excel 2013 中使用 vba 插入电子邮件签名

excel2013关于VBA密码破解的教程

Excel VBA中的XmlHttp Post不更新网站表单

如何编写代码解除EXCEL中VBA的工程保护

怎么将Excel单独两列内容合并为一列