Что нового

UIAutomate - автоматизация нестандартных элементов GUI

Vengro

Новичок
Сообщения
1
Репутация
0
Приветствую. Попробовал я эту библиотеку, но почему-то не получается установить текст в адресную строку FireFox.
Вроде находит объект, кликается, устанавливается фокус, но текст не вставляется.

Устанавливает @error = 3 - ошибка выполнения метода.

Код:
#include <UIAutomate.au3>
Local $h1 = WinGetHandle("[CLASS:MozillaWindowClass]"), $oParent, $oButton
WinActivate($h1)
$oParent = _UIA_GetElementFromHandle($h1)
;$oButton = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Search or enter address", "LegacyIAccessible.Name")
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Search or enter address")
_UIA_ElementSetFocus($oButton)
_UIA_ElementTextSetValue($oButton, "autoit-script.ru")
MsgBox(0, @error & '           ' & @extended, IsObj($oParent) & @CR & @CR &  IsObj($oButton))
 
Последнее редактирование:

Gsq

Новичок
Сообщения
1
Репутация
0
Добрый день. В приложении Viber Win 8.1. не удаётся найти элементы. Кто-то добился успеха ? Спасибо.
 

Tick

Новичок
Сообщения
2
Репутация
0
Добрый день! Огромное спасибо уважаемому автору за огромный труд!
Я пытаюсь заставить скрипт работать при заблокированном экране.

Сначала я вызываю всплывающее меню (было непросто научиться сюда нажимать).
ControlClick(WinGetHandle (" MAIN WINDOW TITLE"),"","[CLASS:AfxWnd140; INSTANCE:24]","left",1,2,2)
Затем я нахожу нужный элемент и кликаю по нему.
Код:
$hWnd = WinWait("[class:#32768]"); окно меню 
$oParent = _UIA_GetElementFromHandle($hWnd)
$aElements = _UIA_FindAllElements($oParent, "ControlType", $UIA_MenuItemControlTypeId)
_UIA_ElementMouseClick($aElements[4],"left",2,2,2,True);

Все прекрасно работает, пока экран не заблокирован.
При заблокированном экране ControlClick нормально отрабатывает и возникает меню.
Но кликнуть по элементу меню не получается.
Я попробовал заменить последнюю строку на
_UIA_ElementDoDefaultAction($aElements[4])
работает на разблокированном экране почему-то только в случае, если выполнить две таких команды подряд :smile:
На заблокированном экране - не работает :(
Нашел мануал :smile:
https://www.autoitscript.com/wiki/FAQ#Why_doesn.27t_my_script_work_on_a_locked_workstation.3F
On a locked station any window will never be active (active is only dialog with text "Press Ctrl+Alt+Del"). In Windows locked state applications run hidden (behind that visible dialog) and do not have focus and active status. So generally don't use Send() MouseClick() WinActivate() WinWaitActive() WinActive() etc. Instead use ControlSend() ControlSetText() ControlClick() WinWait() WinExists() WinMenuSelectItem() etc. Doing so allows you to interact with an application regardless of whether it is active or not. It's possible to run such a script from scheduler on locked Windows stations.
соответственно, ControlClick работает, а _UIA_ElementMouseClick - нет. Но почему не работает _UIA_ElementDoDefaultAction? :(
ПОЖАЛУЙСТА, посоветуйте, есть ли какой-то выход?
буду вам бесконечно признателен...
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,548
Репутация
1,249
Затрудняюсь ответить, почему не работает _UIA_ElementDoDefaultAction на заблокированном экране. В связи с отсутствием ошибок можно предположить, что метод работает, только пункт меню его игнорирует.

Попробуйте стандартными средствами
Код:
; Вызов всплывающего меню SciTE и выбор "Select All"

#include <GuiMenu.au3>
#include <SendMessage.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

$sText = "Select All" ; текст пункта

Sleep(3333) ; время на блокировку вручную (Win+L)

ControlClick("[Class:SciTEWindow]", "", "Scintilla1", "right")
$hWnd = WinWait("[class:#32768]")
$hMenu = _SendMessage($hWnd, 0x01E1)
$iItem = _GUICtrlMenu_FindItem($hMenu, $sText)
$aRect = _GUICtrlMenu_GetItemRect($hWnd, $hMenu, $iItem)
_MouseLeftClick($hWnd, $aRect[0] + 3, $aRect[1] + 3)

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
 
  • Like
Реакции: Tick
Верх