在Excel VBA 2013中获取光标状态

在Excel VBA 2013中获取光标状态,excel,vba,Excel,Vba,我创建了一个宏来执行一系列鼠标单击和鼠标移动(击键宏),以将重复数据输入Oracle(程序/数据库) 我以前使用Dataload Classic或Dataloader Classic(击键程序)将数据输入到Oracle中,但它缺乏“智能”,因此我用一些“智能”创建了自己的击键程序 我正在使用SLEEP命令/函数在每次鼠标移动和鼠标单击后等待几秒/毫秒。有时Oracle会很慢,“暂停”/“加载”/“冻结”,冻结时间可能会超过SLEEP命令的初始等待时间,并继续执行程序,从而将一切都搞糟 例如: 如

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

我以前使用Dataload Classic或Dataloader Classic(击键程序)将数据输入到Oracle中,但它缺乏“智能”,因此我用一些“智能”创建了自己的击键程序

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

例如:

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

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


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

您可以尝试以下使用win api函数的函数,并确定当前光标是否等于等待光标

函数首先加载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

如果忙(沙漏),请尝试检查屏幕.鼠标指针属性


? 你说的curor状态是什么意思?它在床单上的什么地方?如果加载轮正在运行,那么可能有更好的方法来检测正在发生的事情,而不仅仅是光标动画显示的内容。我正在模块中编写它,我一直在网上搜索,但我没有找到任何东西。也许我没有在搜索正确的术语@BruceWayne我们这里的主要问题是为什么要检查光标以获取某些操作?这听起来像是一场灾难。我认为你的“真正”问题是如何确定循环何时完成(鼠标何时不再是沙漏)?有一个“Application.Cursor”属性。你试过了吗?作为一个测试,类似于:If Application.Cursor=xlWait,那么MsgBox“foo”您可能可以在“Do While”循环中包装一个检查。以下是MSDN文档:
While screen.MousePointer = 11
      Sleep(500)
Wend