Что нового

Не могу определить ID кнопки и caption в 3DMax

smsgeorge

Новичок
Сообщения
63
Репутация
0
Здравсвуйте! Возникла такая сложность, не могу определить ID и caption,class,instance кнопки в программе 3DMax. Пробовал программы Control viewer, winspy++,AutoIt Window Info (x86). Ничего не находит, понятнее будет по скриншотам.
show-image.php
 

Вложения

  • Безымянный.png
    Безымянный.png
    188.3 КБ · Просмотры: 20
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
Находится как общий элемент - AdImpApplicationFrame. Хочу сделать помощник для программы, так как многие не знают английский, а в основном все уроки на английском, то хочу сделать так, человек наводит мышкой на кнопку, а ему сразу ее перевод + описание, что делает, если описание обширное, то откроется сайт с документацией.. ну что то в этом роде... Часть кнопок не в этом элементе находит, а вот те что вверху , не находит...
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    147.5 КБ · Просмотры: 9
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
Благодарю. Что то нашло. Только она все время обновляет списки свои, потом бывает зависает.....


Добавлено:
Сообщение автоматически объединено:

InnI
Разобрался, я постоянно тыкал, а хватает только навестись. Если не затруднит, пожалуйста направь меня.. Как в чужой программе определить элемент под мышкой..? Давно не заходил в автоит, что то подзабылось все(
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
определить элемент под мышкой
Для данного конкретного случая, т.е. с использованием UIAutomate
Код:
#include <UIAutomate.au3>

HotKeySet("{F1}", "ShowInfo")

While Sleep(111)
WEnd

Func ShowInfo()
  $oElement = _UIA_GetElementFromPoint()
  If @error Then
    MsgBox(0, "Info", "Error")
  Else
    $Name = _UIA_ElementGetPropertyValue($oElement, "Name")
    $Value = _UIA_ElementGetPropertyValue($oElement, "Value.Value")
    MsgBox(0, "Info", "Name : " & $Name & @CRLF & "Value : " & $Value)
  EndIf
EndFunc
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
Нажимаю f1 на той панеле, на разных кнопках, всегда выходит Name: AdImpApplicationFrame Value: - пустое
А на которых обычными программами узнавал, то вообще и имя и значение , пустые.
InnI
Очень буду благодарен и благодарен уже за твою неоценимую помощь! Я к сожалению сейчас очень загружен. Делаю программу по йоге, самоучитель в анреал енжин 4, учу 3д макс, фотошоп и так далее, как жаль что день такой короткий и на AutoIt меньше сейчас времени чем раньше, поэтому очень буду признателен за помощь!
.............
Вот скрин



Добавлено:
Сообщение автоматически объединено:

Вот что видит инспект.



Добавлено:
Сообщение автоматически объединено:

InnI
Если к примеру навестись на Едит - то его Испектор определяет как AdImpApplicationsFrame, а если нажать на Едит и навестись на список, то его определяет как контекстное меню.


Добавлено:
Сообщение автоматически объединено:

InnI
При наведении на Едит , Тулс, Груп, инспектор вообще их не находит, а только подсвечивает AdImpApplicationsFrame. то есть я их в списке в ручную там не нашел..


Добавлено:
Сообщение автоматически объединено:

InnI
Вот правая част ьпрограммы
How found: Mouse move (335,28)
hwnd=0x00010880 64bit class="AdImpApplicationFrame" style=0x52000000 ex=0x10
RuntimeId: "[42.67712]"
BoundingRectangle: {l:0 t:-8 r:1280 b:45}
ProcessId: 6904
ControlType: UIA_PaneControlTypeId (0xC371)
LocalizedControlType: "панель"
Name: "AdImpApplicationFrame"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
AutomationId: "4096"
ClassName: "AdImpApplicationFrame"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x10880
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:3340,hwnd:0x10880 Main:Nested [pid:6904,hwnd:0x10880 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:UIAutomationCore.dll); Main:Microsoft: MSAA Proxy (unmanaged:UIAutomationCore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "AdImpApplicationFrame"
LegacyIAccessible.Role: клиент (0xA)
LegacyIAccessible.State: фокусируемое (0x100000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsValuePatternAvailable: false
IsWindowPatternAvailable: false
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: "QATHwndSource" pane
LastChild: "" Autodesk.Internal.InfoCenter.InfoToolbar
Next: (null) название
Previous: "" панель
Other Props: Object has no additional properties
Children: "QATHwndSource" pane
"" Autodesk.Internal.InfoCenter.InfoToolbar
Ancestors: "Untitled - Autodesk 3ds Max 2016 " окно
"Рабочий стол" панель
[ No Parent ]
 

Вложения

  • 1 (1).png
    1 (1).png
    199.9 КБ · Просмотры: 11

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
На панели Inspect нажмите кнопку с жёлтой рамкой - текущий элемент будет подсвечиваться. Наведите курсор мыши на панель меню 3dMax. Если подсветилась вся панель, то попробуйте найти пункты меню непосредственно в дереве Inspect. Если их там нет (ветвь панели не раскрывается), то, вероятно, пункты на панели просто нарисованы и не являются элементами.
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
да, подсвечивается вся панель( Как быть в таком случае?


Добавлено:
Сообщение автоматически объединено:

InnI
Для данного конкретного случая, т.е. с использованием UIAutomate
#include <UIAutomate.au3>

HotKeySet("{F1}", "ShowInfo")

While Sleep(111)
WEnd

Func ShowInfo()
$oElement = _UIA_GetElementFromPoint()
If @error Then
MsgBox(0, "Info", "Error")
Else
$Name = _UIA_ElementGetPropertyValue($oElement, "Name")
$Value = _UIA_ElementGetPropertyValue($oElement, "Value.Value")
MsgBox(0, "Info", "Name : " & $Name & @CRLF & "Value : " & $Value)
EndIf
EndFunc
К сожалению определяет не везде , но Инспектор эти участки подсвечивает, Как сделать, чтобы ваш код, определял полностью эти элементы? То есть hwnd же будет меняться каждый раз, нужно получить возможно класс или что для проверки? а также саму проверку и тогда все легко. а панель верхнюю, можно с помощь костылей сделать.


Добавлено:
Сообщение автоматически объединено:

InnI
Control Viewer - показывает эти кнопки, как его поиск использовать в своих целях? То есть она показывает class, instance, Id, Text, по сути этого хватит..
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
Inspect использует специальную технологию - интерфейс UI Automation. Если разработчик не обеспечит поддержку данного интерфейса в своей программе, то доступа к элементам с использованием этой технологии не будет.

определяет не везде, но Инспектор эти участки подсвечивает
Если бы не определял, то выводил бы ошибку. Просто эти значения пустые.
Inspect подсвечивает границу элемента. Теперь посмотрите, какие он определяет значения Name и Value для этого элемента. Такие элементы, как кнопки панели, часто не имеют имён, а отличаются, например, по порядковому номеру. Сравнивайте информацию Inspect и ищите различия.

панель верхнюю, можно с помощь костылей сделать
Уверен, что не только эту панель. Запасайтесь временем и терпением.

как его поиск использовать в своих целях
Так же, как и поиск AutoIt Window Info - подставлять в функции и получать результат.
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
Дорогой InnI , расскажи поподробнее пожалуйста - Так же, как и поиск AutoIt Window Info - подставлять в функции и получать результат... Как твоей программой через код, найти class, instance, Id, Text. А с помощью Control Viewer я бы вытащил значения.. У тебя предоставлены функции по поиску и так далее, но как использовать код Yashied я не понимаю, голова кипит(


Добавлено:
Сообщение автоматически объединено:

Даже не могу запустить)


Добавлено:
Сообщение автоматически объединено:

Скачал по новой, добавил в новую папку и все равно ошибка... перегруз :stars:, мне кажется, я вообще делаю что то не то...
 

Вложения

  • Безымянный.png
    Безымянный.png
    77 КБ · Просмотры: 6
  • Безымянный.png
    Безымянный.png
    26.7 КБ · Просмотры: 3

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
Это заметно. Я мало что понял в вашем потоке сознания. Думаю вам нужно хотя бы немного отдохнуть.

Элементы графического интерфейса делятся на стандартные и остальные. Стандартные - это элементы, созданные стандартными средствами Windows. С этими элементами AutoIt работает, как "с родными", при помощи встроенных функций и прилагаемых UDF. Эти же элементы AutoIt Window Info и Control Viewer легко определяют, т.к. тоже используют стандартные функции. Другие, нестандартные элементы, придумывают разработчики. Если они сделаны на базе стандартных, то с ними можно общаться стандартными средствами. С некоторыми - через интерфейс UIAutomation, если разработчик об этом побеспокоился. У нестандартных элементов часто нет ни class, ни id, ни handle, ни других, специфичных для стандартных элементов, свойств. Поэтому, если вы что-то нашли при помощи Control Viewer, то лучше использовать стандартные функции. Если через Inspect, то функции UIAutomate (хотя я сомневаюсь, что Control Viewer нашёл что-то, чего не видит Inspect).
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
пробовал так, не нажимается кнопка.
Код:
$sClassWnd = '3DSMAX'
$tt = WinGetHandle("Untitled - Autodesk 3ds Max 2016", "")
WinActivate($tt)
ConsoleWrite("pervoe " & $tt & " " & $sClassWnd)
Sleep(1000)
If WinWaitActive($tt, '', 5) Then
	ControlClick($tt, '', '[CLASS:CustButton; INSTANCE:22]', "main", 4)
Else
	MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
EndIf



Добавлено:
Сообщение автоматически объединено:

InnI
Да пойду отдохну, а то с 7 сижу... Ну вот пример инспектора
How found: Mouse move (497,53)
hwnd=0x00020720 64bit class="CustButton" style=0x50000000 ex=0x0
RuntimeId: "[42.132896]"
BoundingRectangle: {l:494 t:49 r:517 b:71}
ProcessId: 6904
ControlType: UIA_PaneControlTypeId (0xC371)
LocalizedControlType: "панель"
Name: ""
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
ClassName: "CustButton"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x20720
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:11916,hwnd:0x20720 Main:Nested [pid:6904,hwnd:0x20720 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:UIAutomationCore.dll); Main:Microsoft: MSAA Proxy (unmanaged:UIAutomationCore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: ""
LegacyIAccessible.Role: клиент (0xA)
LegacyIAccessible.State: фокусируемое (0x100000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsValuePatternAvailable: false
IsWindowPatternAvailable: false
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: [null]
LastChild: [null]
Next: "" панель
Previous: "" панель
Other Props: Object has no additional properties
Children: Container has no children
Ancestors: "" панель
"Main Toolbar" диалоговое окно
"Untitled - Autodesk 3ds Max 2016 " окно
"Рабочий стол" панель
[ No Parent ]
на ту же кнопку и Вивера (в картинках)
 

Вложения

  • Безымянный.png
    Безымянный.png
    129.6 КБ · Просмотры: 5

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
не нажимается кнопка
Ещё раз повторяю. CLASS:CustButton - это нестандартная кнопка. И как она обрабатывает сообщения знают одни разработчики. Часто нарисованные интерфейсы пытаются определить реальное положение курсора мыши и тогда уже разбираются, над какой кнопкой он находится и что нужно делать. Попробуйте MouseClick(). Или предварительно расположите курсор над кнопкой.

Честно вам скажу - нет у меня желания качать и устанавливать этого монстра только для того, чтобы в кнопках поковыряться.
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
InnI
жаль что не желания) Но понимаю вас, у вас очень большая загруженность! Да и если не так, тоже понимаю.. Просто кроме вас вообще никто мне не пишет. Я хотел сделать благо для других и для себя, так как сам столкнулся с английским 3дмаксом и не знанием английского.. Если не разберусь, а разбираюсь только вашей подачей информации, то буду делать, не рабочую копию 3дмакса, а с оболочкой гуи, и там уже можно будет посмотреть перевод, но к сожалению так менее удобнее, так как придется сворачивать саму программу и смотреть искать там уже. Вообще InnI - огромная благодарность тебе за твою громадную отзывчивость! Вдруг не прочел сообщение выше твоего.. там пример 2 программ, не нашел в твоей инстанс...
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
smsgeorge
сам столкнулся с английским 3дмаксом и не знанием английского
Уверен, что в данном случае проще выучить английский.

не нашел в твоей инстанс
Instance - это специальное свойство в AutoIt. Порядковый номер элемента, полученный при перечислении всех элементов с заданными свойствами. Например, находим все элементы с классом Button. Теперь первый по порядку будет иметь instance 1, второй - 2 и т.д. Inspect подобного подсчёта не ведёт, поэтому и не отображает. В UDF UIAutomate за "instance" отвечает функция _UIA_FindAllElements(), номер элемента массива которой и будет instance элемента-объекта.


Добавлено:
Сообщение автоматически объединено:

И, кстати, Inspect - это произведение Microsoft. А "моя" вот эта: wInformer.
 
Верх