Информация об изменениях

Сообщение UI Automation Ngate Client Win QT от 31.08.2023 3:53

Изменено 31.08.2023 4:14 Разраб

UI Automation Ngate Client Win QT
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 Automation Ngate Client Win QT
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;}