Чтение состояния кнопки "Включено"

Как получить состояние Enabled в AutoIt кнопки (будь то она отключена/затенена или включена )? Он работает для свойства Text, но похоже не работает (всегда один и тот же результат независимо от состояния кнопки) для свойства Enabled ("свойства", как в .NET смысл Windows Forms в Visual Studio).

Это для приложения .NET (Windows Forms, VB.NET), где имя кнопки в конструкторе Visual Studio — btnStoreInModule, а текст свойства — S&tore in Module. Свойство Enabled — это то, что я меня интересует. Кнопка имеет тип System.Windows.Forms.Button. Мой скрипт AutoIt нажимает кнопку следующим образом:

ControlClick("My Application", "", "[NAME:btnStoreInModule]")

Приложение отвечает, отключая кнопку во время выполнения операции. Когда операция завершена, кнопка снова становится доступной (не затемняется). Приложение, когда кнопка Store отключена:

Кнопка в отключенном состоянии. Для приложения .NET

Информационный инструмент окна AutoIt дает одинаковый результат как для отключенных, так и для включенное состояние:

>>>> Window <<<<
Title:    My Application 1.2a6
Class:    WindowsForms10.Window.8.app.0.b7ab7b
Position: -4, 34
Size:     1448, 870
Style:    0x17CF0000
ExStyle:  0x00050100
Handle:   0x000C08DE

>>>> Control <<<<
Class:               WindowsForms10.BUTTON.app.0.b7ab7b
Instance:            21
ClassnameNN:         WindowsForms10.BUTTON.app.0.b7ab7b21
Name:                btnStoreInModule
Advanced (Class):    [NAME:btnStoreInModule]
ID:                  592026
Text:                S&tore in Module
Position:            257, 675
Size:                91, 23
ControlClick Coords: 59, 8
Style:               0x5601000B
ExStyle:             0x00000000
Handle:              0x0009089A

Я могу получить текст элемента управления TextBox, используя (TB_Type — это имя текстового поля в окне свойств Visual Studio (свойство "Name")):

Local $sText = ControlGetText ("My Application", "", "[NAME:TB_Type]")

Для кнопки соответствующая строка возвращает S&tore in Module (как и следовало ожидать).

Версия AutoIt: 3.3.8.1 (2012-01-29).


person Peter Mortensen    schedule 13.12.2012    source источник
comment
Подозреваю баг в AutoIt (для чтения состояния Enabled).   -  person Peter Mortensen    schedule 20.04.2020
comment
Примечание. Ссылки на элементы пользовательского интерфейса в AutoIt по тому же имени, что и в Windows Forms, работают нормально ( Я полагаю, что AutoIt поддерживает .NET). Пример: btnStoreInModule в конструкторе Visual Studio с открытым приложением Windows Forms (фактический код Me.btnStoreInModules.Name = "btnStoreInModules") и [NAME:btnStoreInModule] в AutoIt (да, скобки являются частью спецификации AutoIt).   -  person Peter Mortensen    schedule 20.04.2020
comment
Нестабильные имена (меняются при каждой сборке), например WindowsForms10.BUTTON.app.0.b7ab7b21, не нужны.   -  person Peter Mortensen    schedule 20.04.2020
comment
Для ясности, согласно документации, это должно работать, но не похоже (по крайней мере, не в этой версии AutoIt). Давние ошибки обычно не исправляются в AutoIt, поэтому проблема может быть, а может и не быть.   -  person Peter Mortensen    schedule 20.04.2020


Ответы (2)


Используйте функцию ControlCommand следующим образом:

    $isControlEnabled = ControlCommand($hWin, "", "[NAME:button2]", "IsEnabled", "")

Функция вернет => 1, если "[NAME:button2]" включена, и 0, если она отключена.

person TeamKiller    schedule 13.12.2012
comment
Разве кнопка2 не должна быть btnStoreInModule? - person Peter Mortensen; 13.12.2012
comment
Кнопки не имеют названий. У них есть текст (St&ore in Module), у них может быть идентификатор элемента управления при использовании в диалоговом окне. Что лучше всего, используйте Spy++ (и др.), чтобы увидеть идентификатор. - person Hans Passant; 07.02.2015
comment
@Hans Passant: У кнопок есть имена в контексте AutoIt (я использую их в своих сценариях AutoIt при вызовах ControlGetHandle(), ControlClick() и т. д., хотя сочетания клавиш часто более надежны из-за окна/диалога). Я могу получить свойство «Текст», используя имя, но не свойство Enabled. - person Peter Mortensen; 20.04.2020

Следующий код должен работать:

Local $isControlEnabled = ControlCommand("My Application 1.2a6", "", "WindowsForms10.BUTTON.app.0.b7ab7b21", "IsEnabled")
ConsoleWrite($isControlEnabled)

Функция вернет 1, если кнопка включена, и 0, если она отключена.

person Ripon Al Wasim    schedule 08.04.2014
comment
Re должен работать? Вы проверили это? Какую версию AutoIt вы использовали? Я подозреваю ошибку в AutoIt (по крайней мере, в этой версии AutoIt), и форма идентификатора может иметь значение, а может и не иметь. - person Peter Mortensen; 20.04.2020