Что нового

PostMessage() и свернутое окно

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
Всем привет, со старым новым годом! я хочу отправить сообщение о клике мышкой в определенных координатах определенному окну. Нашел функцию вин апи PostMessage($hWnd, $msg, $wParm, $lParm) а вот правильно её использовать не могу понять. прошу помочь примером отправки клика мыши в определенных координатах свернутому окну. всем заранее спасибо и еще раз с праздником!
 
Автор
royalfint

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
странно, но не работает. вставил код. поменял на свои названия окон + добавил перемещения окна в определенную позицию чтобы видеть что окно под управлением, но почему то клика не увидел. пробовал несколько разных приложений и ни одно не получило корректного сообщения о клике
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
royalfint [?]
поменял на свои названия окон
Сообщение нужно отправлять конкретному элементу, как ControlClick(). И координаты в функцию нужно передавать относительно самого элемента (для Au3Info - это значение "ControlClick Coords").
 
Автор
royalfint

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
как элемент я отправлял хэндл окна, а координаты брал из вкладки мышь так как ControlClick Coords не отличны от нуля.
 
Автор
royalfint

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
и как мне заставить это работать если там координаты не появляются? он не видит элементов. но как то же можно отправить процессу событие о том что клик сделали в определенных координатах.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
royalfint [?]
не видит элементов
Если в Au3Info на вкладке "Control" нет информации, то попробуйте отправить сообщение "текущему" (пустому) элементу
Код:
$hCtrl = ControlGetHandle("Заголовок окна", "", "")
Координаты нужно взять с вкладки "Mouse" при включённом режиме в меню "Options - Coord Mode - Client". Если и это не поможет, то проверьте - работает ли стандартный ControlClick().

как то же можно отправить
Мы с вами этим и занимаемся :smile: Только отправляем не процессу, а окну (процессы с сообщениями не работают). Другое дело, как окно это сообщение обрабатывает. Например, на Win7 в игре "Сапёр" при отправке данного сообщения откроется клетка не в переданных координатах, а над которой находится курсор мыши. Не все окна обрабатывают сообщения стандартным образом. А игры ещё и защищены бывают.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, с ControlGetHandle получилось.

Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>

$hCtrl = ControlGetHandle("Безымянный - Paint", "", '[CLASS:Afx:00007FF7D9B40000:8; INSTANCE:1]')

LeftDownUp($hCtrl, 260, 160, 1000)

Func LeftDownUp($hWnd, $X, $Y, $Sleep = 0)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  If $Sleep Then Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc


Кстати, Sleep(0) не делает паузы при выполнении. Посмотри сам
Код:
#include <Timers.au3>

$timer = _Timer_Init()
For $i = 1 To 1000
	If 0 Then Sleep(0)
Next
ConsoleWrite("Без Sleep - "&_Timer_Diff($timer)&@CR)

$timer = _Timer_Init()
For $i = 1 To 1000
	Sleep(0)
Next
ConsoleWrite("Sleep(0) - "&_Timer_Diff($timer)&@CR)

$timer = _Timer_Init()
For $i = 1 To 1000
	Sleep(1)
Next
ConsoleWrite("Sleep(1) - "&_Timer_Diff($timer)&@CR)
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
C2H5OH [?]
Sleep(0) не делает паузы
Сейчас я это знаю, а тогда ещё не был уверен :smile: Я использую эту функцию в таком виде
Код:
Func MouseLeftClick($hWnd, $X, $Y, $Sleep = 10)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
EndFunc



Добавлено:
Сообщение автоматически объединено:

royalfint [?]
Попробуйте этот вариант
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Func MouseLeftClick($hWnd, $X, $Y, $Sleep = 10)
  Local Const $MK_LBUTTON = 0x0001
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, $MK_LBUTTON, _WinAPI_MakeLong($X, $Y))
  Sleep($Sleep)
  _WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONUP))
  _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
EndFunc
 
Автор
royalfint

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
C2H5OH, спасибо с паинтом работает, но вот только с моей не хочет. кстати у него нет базового класса и я использовал обычный
 
Автор
royalfint

royalfint

Трейдер, Программист, Игродел, Веб-Мастер
Сообщения
74
Репутация
0
Код:
ControlClick("Title", "", "","left",1,411,55)
не работает


Добавлено:
Сообщение автоматически объединено:

Код:
While(1)
ControlClick("Steam", "", "","left",1,411,55)
WEnd

сделал так и начал лазить в программе. когда навожу на вкладку то она открывается. походу он отправляет клик но без координат


Добавлено:
Сообщение автоматически объединено:

да и только при активном окне
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
royalfint [?]
когда навожу на вкладку то она открывается <...> и только при активном окне
Значит программа запрашивает реальные координаты курсора и проверяет активность собственного окна.
Классическое минимальное противодействие автоматизации.
 
Верх