Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.
Вот решил попробовать автоматизировать.
UI Automation кнопку находит, но invoke никакого действия не производит(требуется нажатие).
т.е. вот так(F# .Net FX) кнопка только выделяется но нажатия не происходит.
#r "UIAutomationClient.dll"
#r "UIAutomationTypes.dll"
open System.Diagnostics
open System.Windows.Automation
let ng = Process.GetProcesses() |> Array.tryFind(fun p -> p.ProcessName = "ngateclient")
let root = AutomationElement.FromHandle ng.Value.MainWindowHandle
let button_id = "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton"
let btn = root.FindFirst ( TreeScope.Subtree, PropertyCondition( AutomationElement.AutomationIdProperty, button_id))
let inv = btn.TryGetCurrentPattern(InvokePattern.Pattern)
let ip = inv |> snd :?> InvokePattern
btn.SetFocus(); ip.Invoke()
Есть идеи? Еще вопрос. SendKeys работает в терминальном режиме (например в сессии тимвьюера)? У меня подозрение что как то это мониторится и не работает по хорошему.
Пока думаю так сделать. Но нужно будет как-то определять состояние кнопки, визуально что-то нет желания. Возможно по логу службы или по доступности хоста.
UI текст не дает.
#r "UIAutomationClient.dll"
#r "UIAutomationTypes.dll"
open System.Windows.Forms
open System.Diagnostics
open System.Windows.Automation
open System.Threading
Process.Start @"c:\Program Files\Crypto Pro\NGate\ngateclient.exe" |> ignore
Thread.Sleep 5_000
let ng = Process.GetProcesses() |> Array.tryFind(fun p -> p.ProcessName = "ngateclient")
let root = AutomationElement.FromHandle ng.Value.MainWindowHandle
let button_id = "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton"
let btn = root.FindFirst ( TreeScope.Subtree, PropertyCondition( AutomationElement.AutomationIdProperty, button_id))
btn.SetFocus(); SendKeys.SendWait("{ENTER}")
System.Windows.Automation.AutomationElement+AutomationElementInformation
{AcceleratorKey = "";
AccessKey = "";
AutomationId = "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton";
BoundingRectangle = 154;102;205;50;
ClassName = "QPushButton";
ControlType = System.Windows.Automation.ControlType;
FrameworkId = "Qt";
HasKeyboardFocus = false;
HelpText = "";
IsContentElement = true;
IsControlElement = true;
IsEnabled = true;
IsKeyboardFocusable = true;
IsOffscreen = false;
IsPassword = false;
IsRequiredForForm = false;
ItemStatus = "";
ItemType = "";
LabeledBy = null;
LocalizedControlType = "особый";
Name = "";
NativeWindowHandle = 0;
Orientation = None;
ProcessId = 7140;}
Здравствуйте, Разраб, Вы писали:
Р>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.
Р>Вот решил попробовать автоматизировать.
Р>UI Automation кнопку находит, но invoke никакого действия не производит(требуется нажатие).
Р>т.е. вот так(F# .Net FX) кнопка только выделяется но нажатия не происходит.
А точно должна?
Я поискал хоть какое-то упоминание, что QT поддерживает UI Automation, но ничего не нашел.
То, что вы смогли найти некий элемент — скорее всего заслуга того, что разработчики QT все же проецируют частично свои элементы на Win32 GUI, а вот дальше — как повезет.
Скорее всего, контрол, который вы нашли, даже не реализует InvokePattern, поэтому вызывать для него Invoke бесполезно (т.е. UI Automation не считает эту "кнопку" кнопкой).
Можно, в теории попробовать кликать по области, но по моему это в UI Automation сделать не так и просто (с ходу я нашел варианты только через хардкорный вариант с Win32).
Имхо, самое разумное — поискать другой инструмент.
Можете специализированный для QT (это наилучший вариант), но если нужно только щелкать по кнопкам, может подойти и что-то попроще, типа
https://www.autoitscript.com/
Здравствуйте, Разраб, Вы писали:
Р>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.
Р>Вот решил попробовать автоматизировать.
Может попробовать разобраться с консольным клиентом, а не GUI?
https://cpdn.cryptopro.ru/content/ngate/client-user-guide/source/client-ngate-user-guide/user-windows/concept-client-console-windows.html
для автоматизации (стабильной) работы Qt приложений нужны свои средства, иногда можно по картинкам, но проще делать какой-то вариант с отслыкой команд в приложение (пусть клиент на сокете каком-то слушает соединение и выполняет команды)
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, Разраб, Вы писали:
Р>>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.
Р>>Вот решил попробовать автоматизировать.
K>Может попробовать разобраться с консольным клиентом, а не GUI?
K>https://cpdn.cryptopro.ru/content/ngate/client-user-guide/source/client-ngate-user-guide/user-windows/concept-client-console-windows.html
спасибо. завтра проверю, но вроде в моем установщике консольной не было. и на форуме народ спрашивал. там ответили что в бете переподключение реализовано при коротких разрывах.