Что нового

Почему ControlClick не работает?

Пост номер 4 был отмечен как лучший ответ.

zeni1agent

Новичок
Сообщения
6
Репутация
0
Я пытаюсь совершить несколько нажатий мыши внутри рабочей области в разных местах
>>>> Window <<<<
Title: AirDroid
Class: WindowsForms10.Window.8.app.0.141b42a_r33_ad1
Position: 636, 59
Size: 968, 660
Style: 0x16030000
ExStyle: 0x00050000
Handle: 0x00000000004008FA

>>>> Control <<<<
Class: WindowsForms10.Window.8.app.0.141b42a_r33_ad1
Instance: 19
ClassnameNN: WindowsForms10.Window.8.app.0.141b42a_r33_ad119
Name: pbScreenImage
Advanced (Class): [NAME:blum:bScreenImage]
ID: 68144
Text:
Position: 514, 95
Size: 288, 512
ControlClick Coords: 78, 216
Style: 0x56000000
ExStyle: 0x00010000
Handle: 0x0000000000010A30
Но проблема в том что почему-то Control нигде не работает кроме текстового редактора
Я не знаю в чем дело
Код:
; Программа ножницы (не сработало)
   Run("C:\WINDOWS\system32\SnippingTool.exe")
   Local $hWnd = WinWait("Ножницы", "", 10)
   Sleep(2000)
   ControlClick($hWnd, "", " [CLASS:ToolbarWindow32; INSTANCE:1; ID:1]")
; Программа с которой я работаю (не сработало)
    Local $hWnd = WinWait("AirDroid", "", 10)
    ControlClick($hWnd, "", " [CLASS:WindowsForms10.BUTTON.app.0.141b42a_r33_ad1; INSTANCE:19; NAME:pbScreenImage]")
;Блокнот из примера (сработало)
$hWnd = WinWait("[CLASS:Notepad]", "", 10)
ControlClick($hWnd, "", "[CLASS:Edit; INSTANCE:1; ID:15]")

Почему я не могу ни на что нажать?
И как понять где именно было сделано нажатие?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 368
Репутация
1 175
Почему я не могу ни на что нажать?
Во-первых, при описании расширенных свойств контрола не допускаются пробелы между кавычкой и скобкой.
Во-вторых, приложение "Ножницы" имеет два окна, одно из которых скрыто. И скрипт находит именно это скрытое, потому что оно создаётся первым. Поэтому лучше ждать активного окна.
Код:
Run("C:\WINDOWS\system32\SnippingTool.exe")
Local $hWnd = WinWaitActive("Ножницы", "", 10)
Sleep(2000)
ControlClick($hWnd, "", "[CLASS:ToolbarWindow32; INSTANCE:1; ID:1]")


И как понять где именно было сделано нажатие?
Если не указывать координаты, то клик будет в центре. Об этом написано в справке.

По вашему элементу как минимум уберите пробел после кавычки. Также убедитесь, что элемент не заблокирован. И обратите внимание на название класса - у некоторых элементов цифро-буквенный код в конце имени класса может меняться при каждом запуске.
Сообщение автоматически объединено:

И ещё. Некоторые приложения не обрабатывают клик, если главное окно не активно.
 
Автор
Z

zeni1agent

Новичок
Сообщения
6
Репутация
0
Во-первых, при описании расширенных свойств контрола не допускаются пробелы между кавычкой и скобкой.
Во-вторых, приложение "Ножницы" имеет два окна, одно из которых скрыто. И скрипт находит именно это скрытое, потому что оно создаётся первым. Поэтому лучше ждать активного окна.
Код:
Run("C:\WINDOWS\system32\SnippingTool.exe")
Local $hWnd = WinWaitActive("Ножницы", "", 10)
Sleep(2000)
ControlClick($hWnd, "", "[CLASS:ToolbarWindow32; INSTANCE:1; ID:1]")



Если не указывать координаты, то клик будет в центре. Об этом написано в справке.

По вашему элементу как минимум уберите пробел после кавычки. Также убедитесь, что элемент не заблокирован. И обратите внимание на название класса - у некоторых элементов цифро-буквенный код в конце имени класса может меняться при каждом запуске.
Сообщение автоматически объединено:

И ещё. Некоторые приложения не обрабатывают клик, если главное окно не активно.
В программе ножницы я смог все таки использовать control
но в AirDroid есть проблемы
Я не знаю почему но при изменении экрана меняется Handle
и иногда WinGetPos выдает : 0,0,300,380 вместо настоящих координат активного окна
я проверял через if но не смог найти какой либо элемент из AirDroid
Код:
If ControlClick($fm, "", "[CLASS:WindowsForms10.BUTTON.app.0.141b42a_r33_ad1;INSTANCE:10]", "left", 2, 10, 10 ) Then ; ожидание появления калькулятора 5 сек
MsgBox(4096, 'Сообщение', 'завершаем работу скрипта')
Else
MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
EndIf
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 368
Репутация
1 175
Проблема в том, что интерфейс AirDroid состоит из нескольких окон с одинаковыми заголовками и классами. Поэтому нужно определить именно то окно, которое содержит элементы, и использовать его дескриптор в функциях ControlClick. Например так
Код:
#include <WinAPISysWin.au3>

$aList = WinList("[Title:AirDroid;RegexpClass:WindowsForms10.Window.8.app.0]")
For $i = 1 To $aList[0][0]
  If IsArray(_WinAPI_EnumChildWindows($aList[$i][1])) Then
    $hWnd = $aList[$i][1]
    ExitLoop
  EndIf
Next
ControlClick($hWnd, "", "[Name:rdbUserCenter]") ; клик по кнопке профиля
 
Верх