Make my code wait until cursor is loading MS Excel 2016

I am doing some automation work to do repeated copy paste work. Sometimes the server will be so slow. In that time i would be using the below code to wait until the cursor wait goes to normal

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

The above code worked fine for me in MS Excel 2013 32-bit. But now I am using MS Excel 64-bit and the above code is not working. Someone please tell me what needs to be done

1 answer

  • answered 2018-10-17 05:10 Varadharajan

    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 LongPtr
    ptScreenPos As POINT
    End Type
    
    Private Declare PtrSafe Function GetCursorInfo _
    Lib "User32" (ByRef pci As CURSORINFO) As Boolean
    Private Declare PtrSafe Function LoadCursor Lib "User32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As LongPtr
    
    Public Function IsWaitCursor() As Boolean
    
    ' Get handle to wait cursor
    Dim handleWaitCursor As LongPtr
    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
    

    The above code worked for me. I changed the Long datatype to LongPtr