Нахождение элемента HTML и перемещение курсора на элемент, возвращающий неправильную позицию - PullRequest
0 голосов
/ 26 марта 2020

Как видно из заголовка, я пытаюсь переместить курсор мыши на элемент в документе HTML, и я думаю, что некоторые детали, которые я должен поделиться в первую очередь:

  1. Браузер: Inte rnet Explorer 11
  2. IDE: MS Excel VBA
  3. Разрешение монитора: один монитор и два монитора (расширенный), оба разрешения 1920x1080

Я использую getBoundingClientRect, чтобы получить положение элемента HTML и ClientToScreen для сопоставления этого местоположения с местоположением на экране и, наконец, SetCursorPos для задания положения мыши. Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, что всегда есть нефиксированное смещение, где мой курсор перемещается в неправильное место. Даже при попытке на веб-сайте, таком как домашняя страница Google.

После устранения неполадок, поместив мою мышь на кончик области содержимого IE (предполагаемое местоположение 0,0 для getBoundingClientRect), результаты показывают, что после запуска ClientToScreen расположение Y отключено, но довольно много пикселей.

Set to (0,0) position X: 0 ; Y:0  'Manually set variables to 0,0 position
GetCursorPos X: 2400 ; Y:161  'Placed my mouse at the presumed 0,0 position for reference
ClientToScreen position X: 2400 ; Y:-10   'After ClientToScreen position Y position is not as expected, at least to me

Ниже приведен код, который я использовал, вы можете просто открыть окно IE и перейти к http://www.google.com затем запустите макрос.

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Private Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Private Const MOUSEEVENTF_RIGHTUP As Long = &H10

Public Type POINTAPI
    X As Long
    Y As Long
End Type

Sub test()
    Dim testDoc     As HTMLDocument
    Dim testDiv     As HTMLDivElement
    Dim ieWindow    As InternetExplorer
    Dim hwnd        As Long
    Dim pntCursor   As POINTAPI
    Dim pntRet      As Long
    Dim curPos      As POINTAPI

    For Each w In CreateObject("Shell.Application").Windows
        With w
            If .Name = "Internet Explorer" Then
                Set ieWindow = w
                Exit For
            End If
        End With
    Next w


    Set testDoc = ieWindow.document
    Set testDiv = testDoc.getElementById("hplogo")

    hwnd = 0
    hwnd = FindWindow("IEFrame", vbNullString)

    pntCursor.X = testDiv.getBoundingClientRect().Left
    pntCursor.Y = testDiv.getBoundingClientRect().Top

    pntRet = ClientToScreen(hwnd, pntCursor)

    pntRet = SetCursorPos(pntCursor.X, pntCursor.Y)

    SetCursorPosition = (pntRet <> 0)

    mouse_event MOUSEEVENTF_RIGHTDOWN, 0&, 0&, 0&, 0&
    mouse_event MOUSEEVENTF_RIGHTUP, 0&, 0&, 0&, 0&

End Sub

Здесь я пытаюсь переместить курсор в Google Lo go, но на этом моя мышь заканчивается (вверху слева от меню правого клика). Code results

Я уже потратил 3 дня только на эту проблему и не могу найти достаточно подробностей в Интернете, объясняющих эту проблему. Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...