Как видно из заголовка, я пытаюсь переместить курсор мыши на элемент в документе HTML, и я думаю, что некоторые детали, которые я должен поделиться в первую очередь:
- Браузер: Inte rnet Explorer 11
- IDE: MS Excel VBA
- Разрешение монитора: один монитор и два монитора (расширенный), оба разрешения 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](https://i.stack.imgur.com/HTSHU.jpg)
Я уже потратил 3 дня только на эту проблему и не могу найти достаточно подробностей в Интернете, объясняющих эту проблему. Любая помощь будет принята с благодарностью.