Что нового

Как получить дескриптор кнопки «Подробнее» в неразвёрнутом диспетчере задач?

azharchenko

Новичок
Сообщения
4
Репутация
0
Не могу найти способ отыскать дескриптор кнопки "Подробнее" в неразвёрнутом диспетчере задач.

С помощью ControlGetHandle через AutoIT могу получить дескриптор какого-либо элемента окна, но как в этом фрейме произвести поиск кнопки с возратом дескриптора этой кнопки, - это вопрос. Поиск вкладки воспроизводится через _GUICtrlTab_FindTab с указанием имени вкладки, а с этой штукой, естественно, так не работает.

1582817669498.png
Сообщение автоматически объединено:

Фрейм, в котором лежит эта кнопка, - UIHWND - нераспознаваемый элемент, тобишь в нём не покопаться. Он относится к UWP, а не win32.
Нашёл библиотеку UIAutomate.au3, которая работает с нестандартными элементами GUI, но лично у меня взаимодействие с ней успехом до сих пор не закончилось. В ту ли сторону думаю вообще, - хз.
Делать нажатие на кнопки по координатам как-то странно и зависимо от появления окна, тобишь это кривой способ и не пойдёт так.


1582885064508.png
 

Вложения

  • 1582885040129.png
    1582885040129.png
    14 КБ · Просмотры: 2
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Данную кнопку нужно нажать всего один раз сразу после установки системы :wink:

это кривой способ и не пойдёт так
Потому что вы так решили? А я вот считаю, что, в данном конкретном случае, это правильный способ, т.к. кнопка всегда одного размера и находится в определённом месте независимо от размеров и положения окна. Единственный момент - выход за пределы экрана, но и это решаемо. К тому же данный код работает и для кнопки "Меньше" по той же причине
Код:
#RequireAdmin

Opt("MouseCoordMode", 2)

$hWnd = WinActivate("Диспетчер задач")
$aPos = ControlGetPos($hWnd, "", "DirectUIHWND1")
If Not IsArray($aPos) Then Exit
MouseClick("left", 20, $aPos[3] - 25, 1, 0)
 
Автор
A

azharchenko

Новичок
Сообщения
4
Репутация
0
Данную кнопку нужно нажать всего один раз сразу после установки системы :wink:


Потому что вы так решили? А я вот считаю, что, в данном конкретном случае, это правильный способ, т.к. кнопка всегда одного размера и находится в определённом месте независимо от размеров и положения окна. Единственный момент - выход за пределы экрана, но и это решаемо. К тому же данный код работает и для кнопки "Меньше" по той же причине
Код:
#RequireAdmin

Opt("MouseCoordMode", 2)

$hWnd = WinActivate("Диспетчер задач")
$aPos = ControlGetPos($hWnd, "", "DirectUIHWND1")
If Not IsArray($aPos) Then Exit
MouseClick("left", 20, $aPos[3] - 25, 1, 0)



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

Или я что-то не понял на данный момент из вашего сообщения.

У меня это как-то так реализовано

Код:
Run("taskmgr.exe")
Local $hWnd = WinWait("[CLASS:TaskManagerWindow]", "", 2)
WinActivate($hWnd)

Local $hPalette = ControlGetHandle($hWnd, "", "[CLASS:DirectUIHWND; INSTANCE:1]") 
Local $aPalettePos = ControlGetPos($hWnd, "", $hPalette) 
MouseMove($aPalettePos[0] + 15, $aPalettePos[1] + 300, 0)
MouseClick("left")
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
на разных компах с разным разрешением будет работать также по-разному
Поменяйте разрешение на своём мониторе и проверьте.
У меня это как-то так реализовано
В этом случае есть зависимость от вертикального размера окна, т.к. вы отсчитываете координаты от левого верхнего угла. В моём варианте используется нижний угол, к которому кнопка и привязана.
не хочется именно двигать мышь
В чём проблема? Курсор мыши после клика можно вернуть на то место, где он был до клика.

А зачем вам вообще это окно? Узнать список процессов или завершить процесс можно и другими способами...
Сообщение автоматически объединено:

Интересно было бы добраться именно до этой кнопки
Код:
#RequireAdmin

#include <UIAutomate.au3> ; http://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/

$oParent = _UIA_GetElementFromHandle(WinGetHandle("Диспетчер задач"))
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "CBExpandoButtonImage", "AutomationId")
_UIA_ElementDoDefaultAction($oButton)
 
Последнее редактирование:
Автор
A

azharchenko

Новичок
Сообщения
4
Репутация
0
Поменяйте разрешение на своём мониторе и проверьте.

Поменял, проверил, - работает везде. Спасибо )

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

Да, я понял, разобрался.

В чём проблема? Курсор мыши после клика можно вернуть на то место, где он был до клика.

Это я тоже понимаю.

А зачем вам вообще это окно? Узнать список процессов или завершить процесс можно и другими способами...

Было интересно именно разобраться с этим элементом, чтобы в будущем была возможность сделать всё более правильно. Столкнулся с этой *стеной* и пока не разобрался, - было не по себе. Но в данном случае получил еще и много сопутствующего опыта и этот кейс мне очень помог, в общем.

Код:
#RequireAdmin
#include <UIAutomate.au3> ; http://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/

$oParent = _UIA_GetElementFromHandle(WinGetHandle("Диспетчер задач"))
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "CBExpandoButtonImage", "AutomationId")
_UIA_ElementDoDefaultAction($oButton)

Данный код, который вы привели, - у меня не отработал. А вот с WinWaitActive отработал.

Код:
#RequireAdmin
#include <UIAutomate.au3>

Run("taskmgr.exe")

$hWd = WinWaitActive("[CLASS:TaskManagerWindow]")
$oParent = _UIA_GetElementFromHandle($hWd)
$oButton = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "CBExpandoButtonImage", "AutomationId")
_UIA_ElementDoDefaultAction($oButton)

Я не понял только принципа _UIA_GetElementFromHandle. В библиотеке написано, что Создаёт элемент (объект) на основе дескриптора. Зачем он его создаёт? Я этой тонкости не понял.
 
Последнее редактирование:
Верх