Что нового

[Мышь, клавиатура] Использование ControlClick с ControlGetHandle

Fallen

Новичок
Сообщения
39
Репутация
0
Добрый день. Все бьюсь с функцией ControlClick и что-то, ничего у меня не получается. Я так понимаю она должна работать по аналогии с функцией ControlSend, ан нет. ControlSend работает отлично. Ниже мои попытки)

ControlSend
Код:
Example()

Func Example()
    ; Run Notepad

    ; Wait 10 seconds for the Notepad window to appear.
    Local $hWnd = WinWaitActive("Epoch of Shadows")

    ; Retrieve the handle of the edit control in Notepad. The handle returned by WinWait is used for the "title" parameter of ControlGetHandle.
    Local $hControl = ControlGetHandle($hWnd, "", "")

    ; Display the handle of the edit control.
	$i = 0
	While $i<5
    ControlSend ($hControl, "", 0, "tare dekavo")
	  ControlSend ($hControl, "", 0, "{ENTER}")
	  Sleep(300)
	  $i = $i+1
	  WEnd
    ; Close the Notepad window using the handle returned by WinWait.
EndFunc   ;==>Example

ControlClick
Код:
#RequireAdmin
Opt("MouseCoordMode",0)
; Script Start - Add your code below here
Global $hWnd = WinWait("Epoch of Shadows")
   $Handle = getHandle($hWnd)

HotKeySet("!{F1}", "fish")

While 1
   Sleep(100)
   WEnd

Func fish()
ControlClick($Handle, "", 0,"right",1,490,260)
ControlClick($Handle, "", 0,"left",1,55,190)
EndFunc



Func getHandle($nD)
	  $hWnd = ControlGetHandle($nD, "", "")
Return $hWnd
EndFunc
Буду благодарен за любую помощь. Спасибо за внимание.
 
A

Alofa

Гость
Fallen пожалуйста, спокойно и рассудительно напишите комментарий напротив каждой функции (каждой строчки) в вашем втором скрипте то, как вы полагаете, что она (эта функция) в данный момент выполняет согласно тех параметров, которые вы ей назначили.
Совсем не обязательно выкладывать результат в тему - это в первую очередь нужно Вам. Но думаю, если посидеть и порассуждать над каждой строчкой, вооружившись необходимой документацией с одной стороны, и внимательностью с другой - то у вас все получится.
Код:
#RequireAdmin ; -- Запускаем скрипт от имени Администратора
Opt("MouseCoordMode",0) ; -- Назначаем отсчет координат для будущих функций мыши относительно координат активного окна (надеюсь нашей) программы

Global $hWnd = WinWait("Epoch of Shadows") ; -- Объявляем Глобальную переменную, которой после того как появится окно
;                                               с заголовком "Epoch of Shadows" будет присвоено значение дескриптора этого окна.
$Handle = getHandle($hWnd) ; -- Здесь мы переходим к нашей пользовательской функции, передовая ей дескриптор окна.
;                                  Переменной "$Handle" будет присвоено возвращаемое значение данной функции .

HotKeySet("!{F1}", "fish") ; -- ...

While 1 ; -- ...
   Sleep(100) ; -- ...
WEnd ; -- ...

Func fish() ; -- ...
	ControlClick($Handle, "", 0,"right",1,490,260) ; -- ...
	ControlClick($Handle, "", 0,"left",1,55,190) ; -- ...
EndFunc ; -- ...

Func getHandle($nD) ; -- ...
      $hWnd = ControlGetHandle($nD, "", "") ; -- ...
Return $hWnd ; -- ...
EndFunc ; -- ...
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
Код:
#RequireAdmin ; -- Запускаем скрипт от имени Администратора
Opt("MouseCoordMode",0) ; -- Назначаем отсчет координат для будущих функций мыши относительно координат активного окна (надеюсь нашей) программы

Global $hWnd = WinWait("Epoch of Shadows") ; -- Объявляем Глобальную переменную, которой после того как появится окно
;                                               с заголовком "Epoch of Shadows" будет присвоено значение дескриптора этого окна.
$Handle = getHandle($hWnd) ; -- Здесь мы переходим к нашей пользовательской функции, передовая ей дескриптор окна.
;                                  Переменной "$Handle" будет присвоено возвращаемое значение данной функции .

HotKeySet("!{F1}", "fish") ; -- Назначаем на клавишу F1 действие пользовательской функции fish .

While 1 ;
   Sleep(100) ; -- Бездействуем в ожидании нажатия горячих клавиш.
WEnd ; 

Func fish() ; -- Пользовательская функция.
    ControlClick($Handle, "", 0,"right",1,490,260) ; -- Клик пкм 1 раз по координатам - 490,260
    ControlClick($Handle, "", 0,"left",1,55,190) ; -- Клик лкм 1 раз по координатам - 55,190
EndFunc ; -- Конец функции

Func getHandle($nD) ; -- пользовательская функция на получение Handle окна
      $hWnd = ControlGetHandle($nD, "", "") ; -- Собственно сама функция.
Return $hWnd ; -- Возвращаем значение
EndFunc ; -- Конец функции
Так вас устроит? :smile: Просто не видел смысла в описании, так как все просто на уровне детского сада, а работать не хочет.
 
A

Alofa

Гость
Fallen сказал(а):
Так вас устроит? ...
Причем здесь я (или Мы)? Повторюсь - это ВАМ нужно.

Fallen сказал(а):
... все просто на уровне детского сада ...
Вот именно:
(читайте комментарии ПРОПИСНЫМИ БУКВАМИ, в квадратных скобках)
Код:
#RequireAdmin ; -- 
Opt("MouseCoordMode",0) ; -- [!!!ЭТО ВЫ НАВЕРНО ДЛЯ ФУНКЦИЙ "ControlClick" ПОДГОТОВИЛИ? ТАКОЕ НЕ ПРОЙДЕТ - НЕ ТА ОПЕРА!!!]

Global $hWnd = WinWait("Epoch of Shadows") ; -- Объявляем Глобальную переменную, которой после того как появится окно
;                                               с заголовком "Epoch of Shadows" будет присвоено значение [!!!ДЕСКРИПТОРА этого ОКНА!!!].
$Handle = getHandle($hWnd) ; -- Здесь мы переходим к нашей пользовательской функции, передовая ей дескриптор окна. -->[!!!ЗАЧЕМ ВАМ ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ, СОСТОЯЩАЯ ИЗ 1 ВСТРОЕНОЙ, ДА К ТОМУ ЖЕ К КОТОРОЙ ВЫ ОБРАЩАЕТЕСЬ ВСЕГО 1 РАЗ?!!!]
;                                  [!!!ПЕРЕМЕННОЙ "$Handle" БУДЕТ ПРИСВОЕНО ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ ДАННОЙ ФУНКЦИИ!!!].

HotKeySet("!{F1}", "fish") ; -- 

While 1 ;
   Sleep(100) ; -- 
WEnd ; 

Func fish() ; -- 
    ControlClick($Handle, "", 0,"right",1,490,260) ; -- Клик пкм 1 раз по координатам - 490,260 -->[!!!ЧЕМУ У НАС РАВЕН "$Handle" - СМОТРИ СТРОКУ 23. КАКОЙ ИНТЕРЕСНЫЙ controlID (ПАРАМЕТР 3) - ЭТО ВАМ "Autoit Windows Info" ПОКАЗАЛА? ПАРАМЕТР 6(координата X) И 7(координата Y) - ЭТО КООРДИНАТЫ ОТНОСИТЕЛЬНО ЛЕВОГО ВЕРХНЕГО УГЛА ЭЛЕМЕНТА, А НЕ ОКНА (ХОТЯ НЕ УДИВЛЮСЬ ЕСЛИ У ВАС ЭЛЕМЕНТЫ ТАКОГО РАЗМЕРА)!!!]
    ControlClick($Handle, "", 0,"left",1,55,190) ; -- Клик лкм 1 раз по координатам - 55,190
EndFunc ; -- 

Func getHandle($nD) ; -- пользовательская функция на получение Handle окна -->[!!!А В СТРОЧКЕ 5 МЫ ЧТО ПОЛУЧИЛИ?!!]
      $hWnd = ControlGetHandle($nD, "", "") ; -- Собственно сама функция. -->[!!!ЭЭЭ ТАКОЕ ОБЪЯСНЕНИЕ НЕ ГОДИТСЯ. ЗДЕСЬ МЫ ПОЛУЧАЕМ ВНУТРЕННИЙ УКАЗАТЕЛЬ ЭЛЕМЕНТА ОКНА - НЕПОНЯТНО ПРАВДА КАКОГО (ВЫ НЕ ЗАДАЛИ ТРЕТИЙ ПАРАМЕТР "controlID")!!!]
Return $hWnd ; -- Возвращаем значение -->[!!!ТАКИМ ОБРАЗОМ ВЫ ПОЛУЧАЕТЕ ПУСТУЮ СТРОКУ, ЧТО И БУДЕТ ПРИСВОЕНО ПЕРЕМЕННОЙ "$Handle" В СТРОКЕ 7!!!]
EndFunc ; --
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
Насчет :
Код:
Opt("MouseCoordMode",0)

согласен. Это на начальных стадиях испытаний использовалось) Потом где-то на форуме прочел, что он не используется данной функцией.
Насчет :
[!!!ЗАЧЕМ ВАМ ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ, СОСТОЯЩАЯ ИЗ 1 ВСТРОЕНОЙ, ДА К ТОМУ ЖЕ К КОТОРОЙ ВЫ ОБРАЩАЕТЕСЬ ВСЕГО 1 РАЗ?!!!]
Не совсем так. Просто это тестовый файл, который который в случае успеха уйдет в состав общей программы, а там данная функция уже описана, не увидел решения проще, чем тупо скопировать эту функцию оттуда.
Насчет :
КАКОЙ ИНТЕРЕСНЫЙ controlID (ПАРАМЕТР 3) - ЭТО ВАМ "Autoit Windows Info" ПОКАЗАЛА?
Нет, к сожалению "Autoit Windows Info" не показывает ничего кроме title и class ):
Summary :
>>>> Window <<<<
Title: Epoch of Shadows
Class: HGE__WNDCLASS
Position: 360, 94
Size: 646, 579
Style: 0x14CA0000
ExStyle: 0x00000100
Handle: 0x00000000001605EA

>>>> Control <<<<
Class:
Instance:
ClassnameNN:
Name:
Advanced (Class):
ID:
Text:
Position:
Size:
ControlClick Coords:
Style:
ExStyle:
Handle:

>>>> Mouse <<<<
Position: 622, 315
Cursor ID: 0
Color: 0x000000

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<


>>>> Hidden Text <<<<

Насчет :
ЭТО КООРДИНАТЫ ОТНОСИТЕЛЬНО ЛЕВОГО ВЕРХНЕГО УГЛА ЭЛЕМЕНТА, А НЕ ОКНА (ХОТЯ НЕ УДИВЛЮСЬ ЕСЛИ У ВАС ЭЛЕМЕНТЫ ТАКОГО РАЗМЕРА)!!!]
К сожалению, плохо понимаю о чем вы. Я брал координаты из Windows Tool

Ну и относительно :
НЕПОНЯТНО ПРАВДА КАКОГО (ВЫ НЕ ЗАДАЛИ ТРЕТИЙ ПАРАМЕТР "controlID")!!!]
И
Возвращаем значение -->[!!!ТАКИМ ОБРАЗОМ ВЫ ПОЛУЧАЕТЕ ПУСТУЮ СТРОКУ, ЧТО И БУДЕТ ПРИСВОЕНО ПЕРЕМЕННОЙ "$Handle" В СТРОКЕ 7!!!]
Повторюсь, что в аналогичном примере с ControlSend все работает отлично. Функцию ControlGetHandle я нашел на анг. форуме, у одного из пользователей была аналогичная проблема с пустым ControlID и ему посоветовали использовать ControlGetHandle. Данный совет подошел и для меня. Функция не возвращает пустое значение.

Для интереса сделал следующее :
Код:
#RequireAdmin
Opt("MouseCoordMode",0)
; Script Start - Add your code below here
Global $hWnd = WinWait("Epoch of Shadows")
   $Handle = getHandle($hWnd)
   MsgBox(32,"Значение переменной $Handle", $Handle)

Func getHandle($nD)
	  $hWnd = ControlGetHandle($nD, "", "")
Return $hWnd
EndFunc

MsgBox выводит - 0х001605ЕА
 

Yura

Знающий
Сообщения
36
Репутация
7
У вас есть класс, так используйте его в ControlGetHandle. Например
Код:
$hwnd = ControlGetHandle("white_pixel - Paint", "", "[CLASS:Afx:5a0000:8]")
это у меня получение указателя рабочего поля пейнта по названию и классу.
Рекомендую скачать Control Viewer (автор Yashied) и пользоваться вместо Autoit Windows Info, имхо поудобнее.

А вообще если не можете найти место, где программа перестает работать как требуется, то после каждой строки кода выводите полученное значение через MsgBox или ConsoleWrite. Скорее всего у вас $hwnd из ControlGetHandle не получается. Но точно вам никто не скажет, пока сами не проверите - вряд ли кто-то будет ставить вашу игрушку и там пробовать.
ControlClick, насколько помню, кликает по координатам относительно левого верхнего угла котрола, Opt("MouseCoordMode",0) там не пришей кобыле хвоста.

Если $hwnd получается из контрола как надо, если вы не тупите с координатами (проверяйте все в Control Viewer), а все равно ничего не нажимается... то такое тоже иногда бывает. ControlClick имитирует клик мышкой, когда кнопка мыши нажимается и моментально отжимается. Иногда надо задержать недолго нажатой кнопку, чтоб сработало. Попробуйте так нажать (это для левой кнопки мыши), может поможет. $Sleep хоть пару милисекунд поставьте. #include <WinAPI.au3> в начало скрипта добавьте.
Код:
Func MouseLeftClick($hWnd, $X, $Y, $Sleep)
    _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
    Sleep($Sleep)
    _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
EndFunc
 
A

Alofa

Гость
Послушайте не знал, что функция ...
Код:
ControlGetHandle($hWnd, "", "")
... в таком виде возвращает дескриптор элемента который является по умолчанию в окне. :shok:

Fallen сказал(а):
... к сожалению "Autoit Windows Info" не показывает ничего кроме ...
А что за элементы-то?
В первом скрипте шапки темы вы работаете с блокнотом (насколько я понял), а здесь-то чего добиваетесь, может раскроете карты?

Fallen сказал(а):
... Функцию ControlGetHandle я нашел на анг. форуме ...
И у нас тоже есть.

P.s: + Что касается вашего первого скрипта в шапке темы, то можете посмотреть Это, для информации.


Yura сказал(а):
... это у меня получение указателя рабочего поля пейнта по названию и классу ...
Yura у него есть только title и class окна, а не элемента.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
Всем спасибо за ответы.
Yura, Спасибо за помощь. Функция MouseClick как и MouseClickDrag - работает отлично. Повторюсь функция ControlSend - так же отлично работает, хотя начальные параметры у нее с функцией ControlClick абсолютно идентичны. За
Рекомендую скачать Control Viewer (автор Yashied) и пользоваться вместо Autoit Windows Info, имхо поудобнее.
Большее спасибо. Сегодня обязательно попробую.
Alofa,
А что за элементы-то?
В первом скрипте шапки темы вы работаете с блокнотом (насколько я понял), а здесь-то чего добиваетесь, может раскроете карты?
Нет-нет, я не использовал блокнот в первом примере. В нем я так же использую то же самое приложение и все работает на "УРА!". Я просто скопировал пример из Example-а функции и подставил свои параметры, забыл при этом удалить комментарии, которые,собственно, и ввели вас в заблуждение.
И у нас тоже есть.
Видимо я не так выразился, либо вы не так поняли. На форуме писал некто, у кого так же как и у меня "Autoit Window Info" выдавал пустые значение и никак не удавалось воспользоваться функциями Control за неимением достаточной информации. Там ему и посоветовали функцию ControlGetHandle.
 

Yura

Знающий
Сообщения
36
Репутация
7
Fallen сказал(а):
Функция MouseClick как и MouseClickDrag - работает отлично. Повторюсь функция ControlSend - так же отлично работает, хотя начальные параметры у нее с функцией ControlClick абсолютно идентичны.

Я вам о MouseClick не говорил, они с ControlClick вообще по разному имитируют нажатие. Я вам дал 3й способ нажатия - послать сообщение окну, который часто срабатывает в окнах, где ControlClick не работает. И это особенно касается игр, а вы на игру же бота пишете, как я понял.
http://autoit-script.ru/index.php?topic=21382.0 вот Alofa уточнял на счет ControlGetHandle только по $hWnd без дополнительных параметров. То что ControlSend у вас работает, так может он просто текст в окно посылает, если у вас получается хэндл не нужного элемента, а окна. У меня все больше закрадывается подозрение, что то место, по которому вы хотите нажать, вообще не контрол.
А давайте-ка проверим:
Код:
$title = "Epoch of Shadows"
Global $hWnd_window = WinWait($title) ;предполагаю, что работать вы хотите с неактивным окном игры, чтоб комп был свободен
Global $hWnd_control = ControlGetHandle($hWnd_window, "", "") ; это то, что вы получаете из вашей getHandle($nD)

;А теперь посмотрим на их расположение.
Global $window_pos = WinGetPos($hwnd_window)
ConsoleWrite(@CR&"Window handle is: "&$hWnd_window&@CR& _
			"Window position (x,y) is: "&$window_pos[0]&", "&$window_pos[1]&@CR& _
			"Window size (Width, Height) is: "&$window_pos[2]&", "&$window_pos[3]&@CR)

Global $control_pos = ControlGetPos($hwnd_control, "", "")
ConsoleWrite(@CR&"Control handle is: "&$hWnd_control&@CR& _
			"Control position (x,y) is: "&$control_pos[0]&", "&$control_pos[1]&@CR& _
			"Control size (Width, Height) is: "&$control_pos[2]&", "&$control_pos[3]&@CR)

Выполните этот скрипт, когда ваша цацка открыта, скопируйте то, что напишет в консоли, и напишите нам. Предполагаю, что Control handle и Window handle, а также их размеры, будут идентичные, потому что в $hWnd_control вы не дескриптор контрола, а опять окна получаете.
Если вы с активным окном все же работаете (зачем это делать, используя ControlClick??), то получите дескриптор элемента, имеющий фокус ввода, если в окне вообще есть элементы. Мой вам совет- используйте дескриптор окна и шлите нажатие по координатам относительно окна. Чтоб окно всегда было одинаковых размеров, используйте WinMove.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
спасибо за пояснения. Ваш код выводит следующее :
Window handle is: 0x0075072E
Window position (x,y) is: -32000, -32000
Window size (Width, Height) is: 160, 28

Control handle is: 0x0075072E
Control position (x,y) is: 0, 0
Control size (Width, Height) is: 160, 28
Т.е. как я понял - ничего путного. И да - вы правы, ковыряю игру.
Сейчас еще попробую описанный выше способ.

Если вы с активным окном все же работаете (зачем это делать, используя ControlClick??), то получите дескриптор элемента, имеющий фокус ввода, если в окне вообще есть элементы. Мой вам совет- используйте дескриптор окна и шлите нажатие по координатам относительно окна. Чтоб окно всегда было одинаковых размеров, используйте WinMove.
Работаю не с активным окном, потому и мучаюсь. Окно и так всегда одинаковых размеров. Как клики посылать в неактивное окно? WinWaitActive я использую что бы получить дескриптор конкретного окна, а их обычно по 2-3.

P.S.
Попробовал третий вариант. Выдает следующую ошибку :
warning: $WM_LBUTTONDOWN: possibly used before declaration.
_WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN
Мой AutoIT не знает таких переменных. Может разные версии WinAPI или самого AutoIT-a?
 

Yura

Знающий
Сообщения
36
Репутация
7
Fallen сказал(а):
спасибо за пояснения. Ваш код выводит следующее :
Window handle is: 0x0075072E
Window position (x,y) is: -32000, -32000
Window size (Width, Height) is: 160, 28

Control handle is: 0x0075072E
Control position (x,y) is: 0, 0
Control size (Width, Height) is: 160, 28
Т.е. как я понял - ничего путного.
Как раз именно то, что и ожидалось выводит. У вас есть только хэндл окна. Никакого хэндла контрола вы не получаете, а дубль хэндла окна.
Интересно только как координаты окна аж (-32000, -32000), но это к делу не относится.
Вывод какой отсюда: используйте координаты относительно окна.

WinWaitActive я использую что бы получить дескриптор конкретного окна, а их обычно по 2-3.
У вас 2-3 окна и все с одинаковым названием? Ну WinWaitActive так WinWaitActive, ноу проблем.
И правильно, незачем боту мешать работать человеку за компом. Я вообще окно с игрушкой убираю за границы экрана, чтоб не путалось под руками.

Добавьте это в начало скрипта. Константы у вас не подключены просто.
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Или можете в коде добавить:
Код:
Global Const $WM_MOUSEMOVE = 0x0200 ;mouse move
Global Const $WM_MOUSEWHEEL = 0x020A ;wheel up/down
Global Const $WM_LBUTTONDBLCLK = 0x0203 ;left button
Global Const $WM_LBUTTONDOWN = 0x0201
Global Const $WM_LBUTTONUP = 0x0202
Global Const $WM_RBUTTONDBLCLK = 0x0206 ;right button
Global Const $WM_RBUTTONDOWN = 0x0204
Global Const $WM_RBUTTONUP = 0x0205
Global Const $WM_MBUTTONDBLCLK = 0x0209 ;wheel clicks
Global Const $WM_MBUTTONDOWN = 0x0207
Global Const $WM_MBUTTONUP = 0x0208


И пожалуйста код постите как код Autoit, а не в спойлерах.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
Спасибо за ответ.
Да действительно, вы правы, проблема была в не подключенных константах.
Попробовал приведенный код, все равно не работает. Выставлял разные координаты, менял выполняемые действия, ничего..
Код:
#RequireAdmin
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Local $hWnd = WinWaitActive("Epoch of Shadows")

MouseLeftClick($hWnd, 256, 183, 200)

Func MouseLeftClick($hWnd, $X, $Y, $Sleep)
   ; _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
   If _WinAPI_PostMessage($hWnd, $WM_RBUTTONDBLCLK, 0, _WinAPI_MakeLong($X, $Y)) Then
	MsgBox(0,"","ok")
	EndIf
   #cs Sleep($Sleep)
    _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
	MsgBox(0,"","ok")
	#ce
EndFunc

А по поводу
И пожалуйста код постите как код Autoit, а не в спойлерах.
Я постил код Autoit-a как код Autoit-a но в спойлерах, что бы сообщения не были такими громоздкими :smile: Но если всем удобнее так - без проблем.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Yura
Интересно только как координаты окна аж (-32000, -32000)
Это значит, что окно свёрнуто.
это к делу не относится
Ну, я бы не был так оптимистичен. Когда вы передадите в функцию ControlClick хэндл окна, как вы думаете, относительно каких координат будет отсчёт?

Fallen [?]
Control size (Width, Height) is: 160, 28
Вот мне интересно... Каким образом вы собираетесь кликнуть в координаты 490:260 при размерах элемента 160:28?
Сначала добейтесь работы скрипта на нормальном активном окне. Если не получится, то о работе с неактивным, а тем более свёрнутым окном, даже не мечтайте.
 

Yura

Знающий
Сообщения
36
Репутация
7
InnI сказал(а):
Это значит, что окно свёрнуто.
Спасибо, буду знать.
Fallen [?]
Control size (Width, Height) is: 160, 28
Вот мне интересно... Каким образом вы собираетесь кликнуть в координаты 490:260 при размерах элемента 160:28?
Сначала добейтесь работы скрипта на нормальном активном окне. Если не получится, то о работе с неактивным, а тем более свёрнутым окном, даже не мечтайте.
Оо, а я даже не вникал по каким координатам там клики. Вы координаты берете относительно экрана или относительно верхнего левого угла самого окна? Если используете ControlViewer, то там есть привязка координат: Absolute, Window, Client, Control.
Да и мы говорили о неактивном окне, которое можно перекрыть другим окном или передвинуть за границы экрана, а не о свернутом.
Функцию лучше используйте в том виде, в котором я написал, чтоб можно было регулировать время удержания кнопки нажатой.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
Это значит, что окно свёрнуто.
Спасибо, конечно, но окно в тот момент не было свернуто.

Ну, я бы не был так оптимистичен. Когда вы передадите в функцию ControlClick хэндл окна, как вы думаете, относительно каких координат будет отсчёт?
Подозреваю, что относительно окна.
Control size (Width, Height) is: 160, 28
Этот скрипт аналогично пишет и про Window Size, хотя что Control Viewer, что Autoit Window Info показывают Window Size 646х579

Yura
Да и мы говорили о неактивном окне, которое можно перекрыть другим окном или передвинуть за границы экрана, а не о свернутом.
Я и не пытался использовать его в свернутом виде. Ну сами подумайте, смысл мне тогда использовать WinWaitActive - функцию которая дожидается активности окна. Скрипт в любом случае пытается выполниться в активном окне...

Функцию лучше используйте в том виде, в котором я написал, чтоб можно было регулировать время удержания кнопки нажатой.
Использую точь-в-точь, как вы ее прислали. Не хочет работать, то что вы увидели далее это лишь безуспешные попытки ее хоть как-то завести.
В Control Viewer координаты Control - пусты. Пытаюсь работать с координатами Window. Результат тот-же - 0.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Fallen
окно в тот момент не было свернуто
Тогда предположу, что игра была запущена в полноэкранном режиме. Нет? Значит вы не с тем окном работаете.

что Control Viewer, что Autoit Window Info показывают
Но кликать-то вы собираетесь не Control Viewer`ом, правильно? И это ещё раз доказывает, что скрипт находит не то окно, с которого вы снимаете информацию.

Что покажет данный скрипт?
Код:
$aList = WinList("Epoch of Shadows")
If IsArray($aList) Then
  ConsoleWrite("Найдено окон: " & $aList[0][0] & @CRLF)
Else
  ConsoleWrite("Ошибка поиска окон" & @CRLF)
EndIf
 

Yura

Знающий
Сообщения
36
Репутация
7
Этот скрипт аналогично пишет и про Window Size, хотя что Control Viewer, что Autoit Window Info показывают Window Size 646х579
Конечно, что аналогично, у вас нет хэндла на контрол, вообще забудьте о контроле и работайте с окном.

Использую точь-в-точь, как вы ее прислали. Не хочет работать, то что вы увидели далее это лишь безуспешные попытки ее хоть как-то завести.
Вы ничего не заведете, потому что кликаете по координатам, которые за границей окна.

Прикрепите скриншот Control Viewer, вкладка Window, когда наведете на ваше окно. Впечатление такое, что вы хэндл не того окна получаете, что надо, и работаете не с тем окном, что надо.

П.С. Пока писал InnI написал то же самое.

П.С.С.
Код:
$title = "Epoch of Shadows"
Global $hWnd_window = WinWait($title)
ConsoleWrite(@CR&$hWnd_window&@CR)

Посмотрите хэндл тот, что вы получаете из программы. Сравните с хэндлом окна в ControlViewer. Они у вас наверно разные.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
InnI
Что покажет данный скрипт?
Показывает :
Код:
>Exit code: 0    Time: 0.05715
Т.е. ничего. В консоль не пишется ничего.
Аналогично и со скриптом, который предложил Yura. Пусто... Решил попробовать следующее :
Код:
Local $hWnd = WinWaitActive("Epoch of Shadows")
MsgBox(0,"",@CR&$hWnd&@CR)

Вывод - 0x01430D16

И, к сожалению, вы не правы ): Control Viewer выдает аналогичный результат ):
Handle : 0x0000000001430D16

Повторюсь, что функции MouseClick работают прекрасно, хотя они так же используют дескриптор окна. И функция ControlSend тоже отлично.....
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Fallen
В консоль не пишется ничего.
Уберите из скрипта
Код:
#RequireAdmin
Если же игра запущена с правами администратора, то запустите SciTE с правами администратора, а из него уже скрипт. Или замените вывод в консоль на MsgBox.

к сожалению, вы не правы
Вот вам пример. Запустите ДВА блокнота. Запустите из SciTE вот этот скрипт.
Код:
$w1 = WinWait("Безымян")
$w2 = WinWaitActive("Безымян")
MsgBox(0, "", $w1 & ":" & $w2)
Теперь, не трогая "верхний" блокнот, активируйте "нижний". Вы увидите два разных дескриптора. Потому что функция WinWait возвращает первое найденное окно (которое выше), а WinWaitActive - именно активное. Control Viewer и подобные работают с окном под курсором - независимо от активности окна.

Подозреваю, у вас есть ещё окно с таким же заголовком - лаунчер или что-то, запускаемое перед игрой.


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

Fallen
функции MouseClick работают прекрасно, хотя они так же используют дескриптор окна
И в каком параметре данной функции вы нашли дескриптор окна?

функция ControlSend тоже отлично
Данная функция имитирует нажатия клавиш. А вы хотите имитировать клик мыши. Некоторые игры при получении сообщения о клике считывают координаты курсора. Поэтому они в "задвинутых" и свёрнутых окнах не работают.
 
Автор
F

Fallen

Новичок
Сообщения
39
Репутация
0
[quote author=InnI]Уберите из скрипта[/quote]
Вы были правы. Вывод :
Найдено окон: 2
[quote author=InnI]И в каком параметре данной функции вы нашли дескриптор окна?[/quote]

Код:
Функция WinWaitActive : 
Возвращаемое значение

Успех:	Возвращает дескриптор указанного окна.
[quote author=InnI]Вот вам пример. Запустите ДВА блокнота. Запустите из SciTE вот этот скрипт.[/quote]
Честное слово, я прекрасно понимаю о чем вы говорите. И отлично понимаю что возвращает функция WinWait, а что WinWaitActive. И именно потому, что у меня открыто 2 окна использую последнюю и в Window Info тоже выбираю конкретное окно.

[quote author=InnI]Подозреваю, у вас есть ещё окно с таким же заголовком - лаунчер или что-то, запускаемое перед игрой.
[/quote]
Есть лаунчер, но закрывается сразу после проверки на обновление. В процессах его не висит.

[quote author=InnI]Данная функция имитирует нажатия клавиш. А вы хотите имитировать клик мыши. Некоторые игры при получении сообщения о клике считывают координаты курсора. Поэтому они в "задвинутых" и свёрнутых окнах не работают.[/quote]
В данном конкретном случае, я пытаюсь сделать клик в открытом окне. К тестам с неактивным окном я бы приступил, после получения положительного результата.
 
Верх