Что нового

[Автоматизация] Не считывается статус checkbox

repin

Новичок
Сообщения
7
Репутация
0
Добрый день.
Не могу считать статус checkbox с помощью функции ControlCommand
Код:
WinActivate( "Учет времени v.0.0.0")
$s=ControlCommand ( "Учет времени v.0.0.0", "Внеплановая задача", "WindowsForms10.BUTTON.app.0.141b42a_r12_ad11", "IsChecked", "" )
MsgBox(0,"1",$s)

В независимости от статуса checkbox'a выдается сообщение "0".
Единственный рабочий вариант на данный момент - PixelGetColor, но появилась проблема разного отображения цвета и формы checkbox на разных версиях Windows (В данный момент тестируется на Windows 10, до этого проверялось на 8.1 - работало так же.
Создал простое приложение в Visual Studio - использовал стандартный checkbox и все равно не получилось получить статус.
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
repin
использовал стандартный checkbox
У стандартного класс "Button", а у вас что-то нестандартное.
Во-первых, убедитесь, что класс не меняется от запуска к запуску.
Во-вторых, если Au3Info определяет свойство NAME для этого элемента, попробуйте использовать это свойство.

Если ничего не поможет, создайте ещё одно "простое приложение" только с одним этим элементом и выложите - посмотрим.
 
Автор
R

repin

Новичок
Сообщения
7
Репутация
0
Класс не меняется, пробовал обращаться к имени - без результата.
InnI сказал(а):
Если ничего не поможет, создайте ещё одно "простое приложение" только с одним этим элементом и выложите - посмотрим.
Создал пустую форму с чекбоксом в Visual Studio, файл во вложении.
Пробую считать галочку так
Код:
WinActivate( "Form1")
$s=ControlCommand ( "Form1", "", "checkBox1", "IsChecked", "" )
MsgBox(0,"1",$s)
 

Вложения

  • WindowsFormsApplication3.zip
    3.5 КБ · Просмотры: 6

alex33

Скриптер
Сообщения
1,457
Репутация
186
Код:
>>>> Window <<<<
Title:	Form1
Class:	WindowsForms10.Window.8.app.0.2bf8098_r34_ad1
Position:	125, 125
Size:	198, 197
Style:	0x16CF0000
ExStyle:	0x00050100
Handle:	0x018C05B6

>>>> Control <<<<
Class:	WindowsForms10.BUTTON.app.0.2bf8098_r34_ad1
Instance:	1
ClassnameNN:	WindowsForms10.BUTTON.app.0.2bf8098_r34_ad11
Name:	checkBox1
Advanced (Class):	[NAME:checkBox1]
ID:	2754576
Text:	checkBox1
Position:	32, 53
Size:	80, 17
ControlClick Coords:	13, 5
Style:	0x5601000B
ExStyle:	0x00000000
Handle:	0x002A0810

>>>> Mouse <<<<
Position:	177, 212
Cursor ID:	0
Color:	0xEAEAEA

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
checkBox1


>>>> Hidden Text <<<<
Как-то странно... Вот эта команда работает:
Код:
ControlCommand("Form1", "", "[NAME:checkBox1]", "Check")

А IsChecked нет, всегда возвращает 0
Код:
ControlCommand("Form1", "", "[NAME:checkBox1]", "IsChecked")
 
Автор
R

repin

Новичок
Сообщения
7
Репутация
0
И было бы хорошо, если бы Check только ставил галочку, но повторный вызов команды галочку снимает :(
А мне необходимо, чтобы галочка в чекбоксе 100% была.
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
alex33
Современные интерфейсы. Привыкайте.

repin
С нестандартными элементами встроенные функции AutoIt работают некорректно, либо не работают вообще. Изучайте UIAutomate

Код:
#include <UIAutomate.au3>

$hCheckbox = ControlGetHandle("Form1", "", "[NAME:checkBox1]")
; получаем объект по идентификатору
$oElement = _UIA_GetElementFromHandle($hCheckbox)
; переключение состояния
_UIA_ElementDoDefaultAction($oElement)
; проверка состояния
$IsChecked = BitAND(_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State"), 0x10) = True
ConsoleWrite($IsChecked & @CRLF)
 
Автор
R

repin

Новичок
Сообщения
7
Репутация
0
Проверил на тестовой форме - работает, спасибо. :laugh:
А можете объяснить эту строчку
Код:
$IsChecked = BitAND(_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State"), 0x10) = True

как я понимаю
Код:
_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State")
это возвращает 0х100000 или 1000010 если галка стоит, а дальше что происходит в этой строчке?
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
repin
это возвращает 0х100000 или 1000010
Не совсем. Это возвращает набор состояний - сумму параметров. Каждый параметр имеет индивидуальный код (число). Например, когда элемент в фокусе, будет добавлено 0x04, когда отмечен добавится 0x10 и т.д. А функция BitAND как бы "выделяет" нужное состояние из общего набора. Посмотрите пример к функции
Код:
WinGetState()
Там тоже определяется наличие нужной составляющей в общей сумме параметров.
 
Автор
R

repin

Новичок
Сообщения
7
Репутация
0
Правильно ли я понимаю, что если галочка не стоит или какое-то другое состояние без галочки не равное 0x10, то
Код:
BitAND(_UIA_ElementGetPropertyValue($oElement, "LegacyIAccessible.State"), 0x10)

возвращает 0, если равное 0x10, то возвращает число, отличное от 0. Затем происходит сравнение со значением True, если значение 0, то False, если >0, то True.
Правильно я все понял?
 

six-sigma

Новичок
Сообщения
2
Репутация
0
Всем привет, решил не создавать новую тему, но вышеуказанный код у меня тоже не работает.
Подскажите что не так с этим статусом компонент- не показывает ни радиобатоны ни чекбоксы

P/S Тренируюсь над программой PuTTY (the SSH and Telnet client itself) над англ.версией

Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiMenu.au3>
#include <AutoItConstants.au3>
#include <GuiListBox.au3>
#include <ListBoxConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

; Вики https://ru.wikipedia.org/wiki/PuTTY
; Download https://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

Func _ExplainCheckState($iState)
    Switch $iState
        Case $BST_CHECKED
            ConsoleWrite(@CR&"Отмечена")
        Case $BST_INDETERMINATE
            ConsoleWrite(@CR&"Серая, третье состояние, указывающее неопределённое состояние (применяется только когда кнопка имеет стиль $BS_3STATE или $BS_AUTO3STATE).")
        Case $BST_UNCHECKED
            ConsoleWrite(@CR&"Не отмечена")
    EndSwitch
EndFunc   

Run("putty.exe") 
WinWait("PuTTY Configuration","Cate&gory:")

$Wayoftree="Terminal"
 $hWnd = ControlGetHandle("PuTTY Configuration", "", "[CLASS:SysTreeView32; INSTANCE:1]")
 $hItemFound = _GUICtrlTreeView_FindItemEx($hWnd, $Wayoftree)
 If $hItemFound Then
	     _GUICtrlTreeView_SelectItem($hWnd, $hItemFound)
        Else
         MsgBox($MB_SYSTEMMODAL, "Information", "Not Found")
 EndIf


$Check1="[CLASS:Button; INSTANCE:4]]"
_ExplainCheckState(_GUICtrlButton_GetCheck($Check1))
$Check2="[CLASS:Button; INSTANCE:11]"
_ExplainCheckState(_GUICtrlButton_GetCheck($Check2))
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
six-sigma
Код:
$Check1 = ControlGetHandle("PuTTY Configuration", "", "[CLASS:Button; INSTANCE:4]")
_ExplainCheckState(_GUICtrlButton_GetCheck($Check1))
$Check2 = ControlGetHandle("PuTTY Configuration", "", "[CLASS:Button; INSTANCE:11]")
_ExplainCheckState(_GUICtrlButton_GetCheck($Check2))
 

six-sigma

Новичок
Сообщения
2
Репутация
0
Спс большое InnI, как-то я не заметил что аргумент это хэндл

С Putty все работает (я его использовал для примера), но в другом приложении, которое казалось бы аналогичное (назвать/показать не могу) этот фокус не работает.
При обращении к checkbox (от тоже как Баттон определяется) могу его чекнуть, но статус все время Uncheked остается.

P/S Понимаю что глупый вопрос получился, но тем не менее, есть версии, почему такое может происходить и какие еще есть варианты проверки чекбокса/радиобатона/баттона?
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
six-sigma
варианты проверки
Я не пойму... Вы поднимали решённую тему по названию, что ли? Содержимое темы вообще не читали? Здесь же есть ответы и на "почему происходит" и "какие варианты".
 
Верх