Что нового

[Окна, Диалоги] Как нажать на кнопку или элемент меню в [CLASS:TSpTBXToolbar]

ShSergey

Новичок
Сообщения
12
Репутация
1
Вот здесь есть пример контрола TSpTBXToolbar
http://www.silverpointdevelopment.com/sptbxlib/index.htm

Не могу понять как нажимать на кнопку и элементы меню в таком контроле ?

Код:
;~ Пример элемента можно увидеть и скачать отсюда
;~ http://www.silverpointdevelopment.com/sptbxlib/index.htm
;~ http://www.silverpointdevelopment.com/sptbxlib/downloads.htm

#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiToolBar.au3>

$name = 'Form1'
$hWnd = WinGetHandle ($name) 
$hToolbar = ControlGetHandle($name, "", "[CLASS:TSpTBXToolbar; INSTANCE:3]")

ConsoleWrite($hWnd&@CRLF);
ConsoleWrite($hToolbar&@CRLF);

$hMain = _GUICtrlMenu_GetMenu($hWnd)
$hFile = _GUICtrlMenu_GetItemSubMenu($hMain, 0)

$iCountTB = _GUICtrlToolbar_ButtonCount($hToolbar)
ConsoleWrite('Кнопок: ' & $iCountTB&@CRLF);
ConsoleWrite('Элементов меню : ' & _GUICtrlMenu_GetItemCount($hMain)&@CRLF);


В примере ни кнопок ни элементов меню не находит.
 
Автор
S

ShSergey

Новичок
Сообщения
12
Репутация
1

Для MouseClick() нужны координаты x, y. Чтобы их получить нужно вызвать ControlGetPos для которого нужно знать controlID. Но как controlID узнать ?

Для Send() нет горячих клавиш для нажатия.

Хотелось бы сделать через ControlClick, но как узнать controlID для элементов находящихся на TSpTBXToolbar ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ShSergey [?]
как controlID узнать
http://autoit-script.ru/autoit3_docs/intro/controls.htm

Для Send() нет горячих клавиш для нажатия
Эту фразу я не понял. Если имеете в виду - посылать горячие клавиши через Send(), то это можно.

сделать через ControlClick
Не реагируют эти панели на ControlClick(). А их отдельные элементы стандартные средства AutoIt не видят.
 
Автор
S

ShSergey

Новичок
Сообщения
12
Репутация
1
Не реагируют эти панели на ControlClick(). А их отдельные элементы стандартные средства AutoIt не видят.
Так в этом же есть вопрос этой темы, а Вы отсылаете к http://autoit-script.ru/autoit3_docs/intro/controls.htm чтобы узнать controlID
1. Я знаю про это и AutoIt Window Info не видит controlID этих элементов, только controlID TSpTBXToolbar.

Но ведь AutoIt Window Info также не видит controlID стандартного меню Windows, но я могу нажать на нужный пункт меню послав команду WinMenuSelectItem.

2. Скажите как может помочь предлагаемый Вами Send() в получении controlID этих элементов ?
Ведь Send() - согласно справки выполняет эмуляцию последовательность клавиатурных нажатий в активном окне.

У элементов расположенных на TSpTBXToolbar нет горячих клавиш на которые они среагируют (например Send("{F4}" и т.п.) поэтому и нажать элементы расположенные на TSpTBXToolbar используя эмуляцию последовательность клавиатурных нажатий в активном окне не получится - вот что значит моя фраза "Для Send() нет горячих клавиш для нажатия"
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ShSergey [?]
отсылаете ... чтобы узнать controlID
Я решил, что вам нужно узнать controlID самих панелей, а не их элементов, т.к. кнопки панели различаются по CommandID и Index, а не по controlID.

стандартного меню Windows
Вот в этом и проблема. AutoIt работает со стандартными элементами Windows. А эти панели - нестандартные, "самописные". На какие сообщения они реагируют знают только разработчики. Например, чтобы получить количество кнопок, панели отправляют сообщение $TB_BUTTONCOUNT. А эти панели, вероятно, данное сообщение не обрабатывают.

как может помочь ... Send() в получении controlID
Никак. Эта функция просто посылает нажатия клавиш в активное окно. Например, чтобы активировать панель меню нужно послать F10 в активное окно.

У элементов расположенных на TSpTBXToolbar нет горячих клавиш
Верно. Горячие клавиши обрабатывает главное окно. И если вы оправите Ctrl+N, то программа отреагирует так же, как если бы вы нажали кнопку на панели или выбрали пункт меню "New". Другими словами, с нестандартными элементами приходится работать теми средствами, которые предусмотрели разработчики.
 

veselroger

Новичок
Сообщения
16
Репутация
3
У нас на работе тоже дельфийское самописное. Фиг получишь инфу из элементов. Порой приходится писать костыли. А что делать (( So sad (
Взял пример с указанного сайта "CompiledDemos\Customizer"
Это плохо, но если уж вы рассматривали возможность Send, то:
Код:
MenuK("File","2")
MenuK("Edit","2")

Func MenuK($cmd,$item)
   ;Переходим в начальном состояние для работы
   WinACtivate("[CLASS:TForm1]")
   Send("{ALT}")
   ;Переходим на нужное место
   Select
	  case $cmd = "File"
		 Send("{F 2}")
		 Send("{ENTER}")
	  case $cmd = "Edit"
		 Send("{E 1}")
	  case $cmd = "Format"
		 Send("{F 3}")
		 Send("{ENTER}")
   EndSelect
   Sleep(500)
   Send("{ALT}")
   Sleep(300)
EndFunc

Знаю, что убого, неправильно и т.д. Ну а что делать. Вообще, тут где-то рядом была тема про написание бота для онлайн игры с толстым клиентом и выдиранием от туда данных. Я вот думаю почитать, вникнуть, вдруг пригодится для такого. По сути, то же выдирание данных. Может, конечно, ошибаюсь. А может и нет: http://autoit-script.ru/index.php/topic,4334.0.html
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
veselroger
Выдрать данные, как вы выражаетесь, можно при помощи этого
http://www.autoitscript.com/forum/topic/153520-iuiautomation-ms-framework-automate-chrome-ff-ie
Вопрос в другом - что с этими данными делать? Если элемент реагирует, например, только на мышь, то всё равно придётся "тащить" мышь в его координаты и кликать.
Этим и "грешат" самописные интерфейсы - они рассчитаны на пользователя, а не на автоматизацию.
 

veselroger

Новичок
Сообщения
16
Репутация
3
InnI, спасибо. Попробую побаловаться на досуге.
А про данные. Просто если есть меню, то хотелось бы знать, какие в нём есть элементы. Как минимум не нужно забивать все элементы. Плюс, если элементы добавляются в меню динамически, то тут даже таким ужасом, как я привёл, не сделаешь и тут как повезёт. 50/50. Либо угадаешь, либо нет. Хорошо, когда есть какие-то элементы, за которые можно зацепиться. Например, у нас есть грид с данными, откуда не получить данные. Но есть 1 читкод. Если выбрать ячейку, то один из элементов получает текст из ячейки. Соответственно, через такой костыль можно достучаться до информации. Попробую посмотреть ваш пример, может быть удастся его применить на пользу Родине )

ShSergey, а какой у вас пример? (название или ссылка на архив с примером, если можно). Просто то, что я посмотрел - хоткей есть не для каждого элемента. А через Альт можно худо-бедно хоть как-то открыть меню и перейти тупым сендом до элемента.

UPD: Прошёлся по всем примерам из архива. Ваш пример с FormPopupMenu можно так же сделать, как и пример Customizer. Вот с Overview всё плохо. "Из коробки" без сторонних библиотек только если через координаты и мышь. То есть кликнуть на первый элемент и перейти влево/вправо )
 
Автор
S

ShSergey

Новичок
Сообщения
12
Репутация
1
Вопрос в другом - что с этими данными делать? Если элемент реагирует, например, только на мышь, то всё равно придётся "тащить" мышь в его координаты и кликать.
Если не получить для них ControlID, то пойдет и мышь. Только как понять сколько пунктов в выпадающем меню, какие у них названия и координаты куда кликать.
В приложении указанные пункты меню динамические т.е. берутся из папки с программой. Например файл - это пункт меню в этой программе, папка - это субменю в этой программе.

Например в меню есть пункт "Пример", как мне его найти и кликнуть мышкой по нему ?



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

ShSergey, а какой у вас пример? (название или ссылка на архив с примером, если можно).
Программа лицензионная работает только с ключом CodeMeter.
В ней есть такое меню как в примере.
Хотелось сделать плавающий ToolBar и с иконками, чтобы при нажатии на иконку нажимался нужный пункт меню в этой программе.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ShSergey [?]
какие у них названия и координаты куда кликать
Изучайте UIAutomation (см. ссылку выше).
Можно ещё использовать распознавание текста, функции работы с пикселями или библиотеки по поиску картинок.
 
Верх