powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / WM_LBUTTONDOWN нажимает не туда
4 сообщений из 4, страница 1 из 1
WM_LBUTTONDOWN нажимает не туда
    #36724239
Vic65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть необходимость сделать програмно клик в определённой области IE (на сайте уважаемого вендора, с целью автоматизации), но клик не получается сделать в нужном месте.
Сайт на паролях, сертификатах и тд.. Но удалось локализовать "неисправность" с помощью "Сапёра".
Посылаю сообщение WM_LBUTTONDOWN окну Сапёра в точку с координатами (3, 4) (как мне кажется):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Private Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long

Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
Private Const WM_COMMAND = &H111
Private Const BM_CLICK = &HF5
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const MK_LBUTTON = &H1

Public Sub ClikСапёр()
    Dim hWnd As Long
    Dim lParam As Long
'    shell "winmine.exe", vbNormalFocus
    hWnd = FindWindow(vbNullString, "Сапер")
Let lParam = MakeDWord( 3 ,  4 )
'    MsgBox hWnd & " " & HiWord(lParam) & " " & LoWord(lParam)
e = SendMessage(hWnd, WM_LBUTTONDOWN,  0 , lParam)
End Sub
      Function MakeDWord(LoWord As Integer, HiWord As Integer) As Long
         MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
      End Function
   Function LoWord(DWord As Long) As Integer
      If DWord And &H8000& Then ' &H8000& = &H00008000
         LoWord = DWord Or &HFFFF0000
      Else
         LoWord = DWord And &HFFFF&
      End If
   End Function

   Function HiWord(DWord As Long) As Integer
      HiWord = (DWord And &HFFFF0000) \ &H10000
   End Function
Клик доходит до окна, но в точку с непонятными координатами.
MS Spy++ говорит, что это точка с xPos:-2676 yPos:19
Причём не имеет значение какие координаты указаны в строке:
Код: plaintext
lParam = MakeDWord( 3 ,  4 )
Клик всегда в волшебную точку -2676;19

Как попасть куда хочется?

Спасибо.
...
Рейтинг: 0 / 0
WM_LBUTTONDOWN нажимает не туда
    #36724299
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
'Constants
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4

Public Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long
Public Declare Sub mouse_event Lib "user32.dll" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Sub ClickAt(ByVal X As Long, ByVal Y As Long)
    'Click at a certain XY position on the screen.
    SetCursorPos X, Y
    Wait  10 
    mouse_event MOUSEEVENTF_LEFTDOWN,  0 ,  0 ,  0 ,  0 
    Wait  10 
    mouse_event MOUSEEVENTF_LEFTUP,  0 ,  0 ,  0 ,  0 
End Sub

Public Sub Wait(ByVal milliseconds As Long)
On Error Resume Next
    'Wait the specified number of milliseconds without hanging the program
    Dim StartTime As Long, StopTime As Long
    StartTime = timeGetTime
    StopTime = StartTime + milliseconds
    DoEvents
    Do Until timeGetTime > StopTime
        DoEvents
    Loop
End Sub

Dim lTop As Long
Dim lLeft As Long

'от левого верхнего края экрана
lTop  =  100 
lLeft  =  200 
ClickAt lLeft, lTop
...
Рейтинг: 0 / 0
WM_LBUTTONDOWN нажимает не туда
    #36724331
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так работает, проверил на сапёре. Учтите о типах параметров.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202

Function MakeDWORD(LoWord As Integer, HiWord As Integer) As Long
   MakeDWORD = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function
      
Private Sub Command1_Click()
    Dim hSaperWnd As Long, lParam As Long

    hSaperWnd = FindWindow(vbNullString, "Сапер")
    lParam = MakeDWORD( 100 ,  100 )

    Call SendMessage(hSaperWnd, WM_LBUTTONDOWN,  0 &, lParam)
    Call SendMessage(hSaperWnd, WM_LBUTTONUP,  0 &, lParam)
End Sub
...
Рейтинг: 0 / 0
WM_LBUTTONDOWN нажимает не туда
    #36724933
Vic65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, этот способ я пробовал, но он не очень подходит...
(зато я теперь знаю как им правильно пользоваться) спасибо!
VSVLAD, огромное спасибо!!!
Тему можно закрывать.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / WM_LBUTTONDOWN нажимает не туда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]