ni.com is currently undergoing scheduled maintenance.

Some services may be unavailable at this time. Please contact us for help or try again later.

LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Controling other Aplication GUI objects

For the purpose of general test automation I am looking for a robust low level approach to controlling external GUIs. In the past I have used LabVIEW to call Autoit applications. Using the scripting language to abstract GUI control worked to a large degree but when dealing with GUI objects not supported by Autoit such as WindowsForms10 checkboxes I didn't have a good solution. I don't really know what Autoit does under the hood but I was wondering if there was any way to code something similar from the ground up in LabVIEW with .Net or something? Ideally where I would like to start if controlling a WindowsForms10 checkboxes on a C# GUI to do things like Check the box, Uncheck the box, Check if the box is checked to get the basics am move forward from there but I could really use a nudge in the right direction.

 

0 Kudos
Message 1 of 5
(4,019 Views)

Brandon.Baxter, 

Please refer to the forum post linked below (the solution) as it has a good description of how to interact with WindowsForms using a custom made script instead of Autoit. 

https://forums.ni.com/t5/LabVIEW/How-do-I-convert-a-C-executable-to-a-LabVIEW-executable/td-p/832192

Let me know how it goes and what challenges you run into. 


0 Kudos
Message 2 of 5
(3,952 Views)

t@nim@t0R thank you for the link, I have read it thoroughly over the weekend. From my understanding the post covers creating .NET assemblies to give LabVIEW extra functionality and it covers controlling a GUI with Autoit. In this post the solution for controlling the external application GUI was to invoke Autoit scripting in LabVIEW through the ActiveX interface. I was hoping to control an external application directly through LabVIEW with low level control through .NET .This is a solution that I have used in the past but I am running into controls that are not supported by Autoit.

0 Kudos
Message 3 of 5
(3,921 Views)

So are you looking for resources on how to use .NET in LabVIEW? 

I have included a few resources on using .NET libraries in LabVIEW: 

Requirements for Using .NET Assemblies in LabVIEW


Calling .NET assemblies from LabVIEW
0 Kudos
Message 4 of 5
(3,879 Views)

Thank you for the references, I have dabbled in .NET before but the documentation dives you a mush bigger picture of the functionality, and I really appreciate it ;). I have found a collection native windows libraries for automating UIs that I can call through .net (most notably UIAutomationClient.dll). I feel like this could be the solution to the OP because it gives access to native low level accessibility and automation code. That being said I am running into some issues putting the solution into practice.

 

Below is some code I wrote to control pressing the "1" button on the windows calculator in C#:

private void StartAutomationCalc()
{
    //Get the Root Automation Element, i.e. Desktop
    AutomationElement desktopObject = AutomationElement.RootElement;

    Automation.Condition CalculatorCondition = new PropertyCondition(AutomationElement.NameProperty, "Calculator");
    Automation.Condition ButtonOneCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "131");

    AutomationElement CalculatorWindow = desktopObject.FindFirst(TreeScope.Children, CalculatorCondition);

    AutomationElement ButtonOneElement = CalculatorWindow.FindFirst(TreeScope.Descendants, ButtonOneCondition);
    InvokePattern ButtonOneInvoke = ButtonOneElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
    ButtonOneInvoke.Invoke();
}

I did this in C# as a sanity check before I started because the documentation for the functionality is on MSDN.

 

 

Essentially what I am doing is navigating the Windows Automation Element Tree to find the calculator 1 button, isolate its Invoke Method, and calling the method to "press" the button

 

I have recreated the code in a LabVIEW VI but I am having trouble with the typecasting the Generic object returned by the "GetCurrentPattern" method to an InvokePattern Object. Attatched is my progress any help would be appreciated. I think I should use the "to more specific class" primitive but I'm not sure how.

0 Kudos
Message 5 of 5
(3,859 Views)