rautomation 2.0.1-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +41 -0
- data/.rspec +2 -0
- data/.yardopts +8 -0
- data/CHANGES.md +276 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +142 -0
- data/Rakefile +73 -0
- data/ext/AutoItX/AutoItX.chm +0 -0
- data/ext/AutoItX/AutoItX3.dll +0 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.cpp +30 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj +179 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.filters +42 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.user +3 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/ReadMe.txt +48 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/dllmain.cpp +19 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.cpp +8 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.h +22 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/table_support.cpp +282 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/targetver.h +8 -0
- data/ext/IAccessibleDLL/IAccessibleDLL.sln +31 -0
- data/ext/IAccessibleDLL/IAccessibleDLL.suo +0 -0
- data/ext/IAccessibleDLL/Release/IAccessibleDLL.dll +0 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/Clicker.cs +63 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/SelectList.cs +116 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/Spinner.cs +46 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TabControl.cs +54 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TableControl.cs +132 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TextControl.cs +50 -0
- data/ext/UiaDll/RAutomation.UIA/Expander.cs +59 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Element.cs +166 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Enumerable.cs +76 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Property.cs +27 -0
- data/ext/UiaDll/RAutomation.UIA/Properties/AssemblyInfo.cs +36 -0
- data/ext/UiaDll/RAutomation.UIA/Properties/AutomationProperties.cs +18 -0
- data/ext/UiaDll/RAutomation.UIA/RAutomation.UIA.csproj +77 -0
- data/ext/UiaDll/Release/RAutomation.UIA.dll +0 -0
- data/ext/UiaDll/Release/UiaDll.dll +0 -0
- data/ext/UiaDll/UiaDll/ArrayHelper.cpp +14 -0
- data/ext/UiaDll/UiaDll/ArrayHelper.h +7 -0
- data/ext/UiaDll/UiaDll/AssemblyInfo.cpp +40 -0
- data/ext/UiaDll/UiaDll/ControlMethods.cpp +16 -0
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.cpp +24 -0
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.h +16 -0
- data/ext/UiaDll/UiaDll/Locator.cpp +93 -0
- data/ext/UiaDll/UiaDll/Locator.h +55 -0
- data/ext/UiaDll/UiaDll/MenuItemSelector.cpp +75 -0
- data/ext/UiaDll/UiaDll/MenuItemSelector.h +24 -0
- data/ext/UiaDll/UiaDll/MenuMethods.cpp +62 -0
- data/ext/UiaDll/UiaDll/ReadMe.txt +38 -0
- data/ext/UiaDll/UiaDll/SelectListMethods.cpp +84 -0
- data/ext/UiaDll/UiaDll/SpinnerMethods.cpp +61 -0
- data/ext/UiaDll/UiaDll/StringHelper.cpp +57 -0
- data/ext/UiaDll/UiaDll/StringHelper.h +15 -0
- data/ext/UiaDll/UiaDll/StringMethods.cpp +8 -0
- data/ext/UiaDll/UiaDll/TabControlMethods.cpp +40 -0
- data/ext/UiaDll/UiaDll/TableMethods.cpp +108 -0
- data/ext/UiaDll/UiaDll/TextMethods.cpp +25 -0
- data/ext/UiaDll/UiaDll/ToggleStateHelper.h +10 -0
- data/ext/UiaDll/UiaDll/UiaDll.cpp +216 -0
- data/ext/UiaDll/UiaDll/UiaDll.h +13 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj +167 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +110 -0
- data/ext/UiaDll/UiaDll/app.ico +0 -0
- data/ext/UiaDll/UiaDll/app.rc +0 -0
- data/ext/UiaDll/UiaDll/dllmain.cpp +1 -0
- data/ext/UiaDll/UiaDll/resource.h +3 -0
- data/ext/UiaDll/UiaDll/stdafx.cpp +5 -0
- data/ext/UiaDll/UiaDll/stdafx.h +41 -0
- data/ext/UiaDll/UiaDll/targetver.h +8 -0
- data/ext/UiaDll/UiaDll.sln +57 -0
- data/ext/WindowsForms/.nuget/NuGet.Config +6 -0
- data/ext/WindowsForms/.nuget/NuGet.exe +0 -0
- data/ext/WindowsForms/.nuget/NuGet.targets +136 -0
- data/ext/WindowsForms/Release/FizzWare.NBuilder.dll +0 -0
- data/ext/WindowsForms/Release/UIA.Extensions.dll +0 -0
- data/ext/WindowsForms/Release/WindowsForms.exe +0 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.Designer.cs +168 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.cs +103 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.resx +123 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.Designer.cs +218 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.cs +52 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.Designer.cs +77 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.cs +43 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.resx +120 -0
- data/ext/WindowsForms/WindowsForms/FizzWare.NBuilder.dll +0 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +527 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.cs +109 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.resx +126 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.Designer.cs +119 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.cs +34 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/Program.cs +21 -0
- data/ext/WindowsForms/WindowsForms/Properties/AssemblyInfo.cs +36 -0
- data/ext/WindowsForms/WindowsForms/Properties/Resources.Designer.cs +71 -0
- data/ext/WindowsForms/WindowsForms/Properties/Resources.resx +117 -0
- data/ext/WindowsForms/WindowsForms/Properties/Settings.Designer.cs +30 -0
- data/ext/WindowsForms/WindowsForms/Properties/Settings.settings +7 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.Designer.cs +93 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.cs +19 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/UIA.Extensions.dll +0 -0
- data/ext/WindowsForms/WindowsForms/ValueMonthCalendar.cs +28 -0
- data/ext/WindowsForms/WindowsForms/WindowsForms.csproj +166 -0
- data/ext/WindowsForms/WindowsForms/packages.config +4 -0
- data/ext/WindowsForms/WindowsForms.sln +46 -0
- data/lib/rautomation/adapter/autoit/button.rb +59 -0
- data/lib/rautomation/adapter/autoit/locators.rb +22 -0
- data/lib/rautomation/adapter/autoit/mouse.rb +38 -0
- data/lib/rautomation/adapter/autoit/text_field.rb +70 -0
- data/lib/rautomation/adapter/autoit/window.rb +197 -0
- data/lib/rautomation/adapter/autoit.rb +8 -0
- data/lib/rautomation/adapter/helper.rb +64 -0
- data/lib/rautomation/adapter/ms_uia/button.rb +21 -0
- data/lib/rautomation/adapter/ms_uia/button_helper.rb +19 -0
- data/lib/rautomation/adapter/ms_uia/checkbox.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/constants.rb +111 -0
- data/lib/rautomation/adapter/ms_uia/control.rb +134 -0
- data/lib/rautomation/adapter/ms_uia/functions.rb +279 -0
- data/lib/rautomation/adapter/ms_uia/keys.rb +121 -0
- data/lib/rautomation/adapter/ms_uia/keystroke_converter.rb +122 -0
- data/lib/rautomation/adapter/ms_uia/label.rb +18 -0
- data/lib/rautomation/adapter/ms_uia/list_box.rb +46 -0
- data/lib/rautomation/adapter/ms_uia/list_item.rb +22 -0
- data/lib/rautomation/adapter/ms_uia/locators.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/menu.rb +36 -0
- data/lib/rautomation/adapter/ms_uia/radio.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/select_list.rb +85 -0
- data/lib/rautomation/adapter/ms_uia/spinner.rb +31 -0
- data/lib/rautomation/adapter/ms_uia/tab_control.rb +46 -0
- data/lib/rautomation/adapter/ms_uia/table.rb +140 -0
- data/lib/rautomation/adapter/ms_uia/text_field.rb +39 -0
- data/lib/rautomation/adapter/ms_uia/uia_dll.rb +428 -0
- data/lib/rautomation/adapter/ms_uia/value_control.rb +21 -0
- data/lib/rautomation/adapter/ms_uia/window.rb +289 -0
- data/lib/rautomation/adapter/ms_uia.rb +27 -0
- data/lib/rautomation/adapter/win_32/button.rb +14 -0
- data/lib/rautomation/adapter/win_32/button_helper.rb +24 -0
- data/lib/rautomation/adapter/win_32/checkbox.rb +14 -0
- data/lib/rautomation/adapter/win_32/constants.rb +73 -0
- data/lib/rautomation/adapter/win_32/control.rb +86 -0
- data/lib/rautomation/adapter/win_32/functions.rb +336 -0
- data/lib/rautomation/adapter/win_32/keys.rb +146 -0
- data/lib/rautomation/adapter/win_32/label.rb +10 -0
- data/lib/rautomation/adapter/win_32/list_box.rb +40 -0
- data/lib/rautomation/adapter/win_32/locators.rb +22 -0
- data/lib/rautomation/adapter/win_32/mouse.rb +59 -0
- data/lib/rautomation/adapter/win_32/password_field.rb +15 -0
- data/lib/rautomation/adapter/win_32/radio.rb +11 -0
- data/lib/rautomation/adapter/win_32/select_list.rb +97 -0
- data/lib/rautomation/adapter/win_32/table.rb +25 -0
- data/lib/rautomation/adapter/win_32/text_field.rb +52 -0
- data/lib/rautomation/adapter/win_32/window.rb +277 -0
- data/lib/rautomation/adapter/win_32.rb +23 -0
- data/lib/rautomation/button.rb +55 -0
- data/lib/rautomation/element_collections.rb +55 -0
- data/lib/rautomation/platform.rb +15 -0
- data/lib/rautomation/text_field.rb +60 -0
- data/lib/rautomation/version.rb +3 -0
- data/lib/rautomation/wait_helper.rb +23 -0
- data/lib/rautomation/window.rb +248 -0
- data/lib/rautomation.rb +8 -0
- data/rautomation.gemspec +52 -0
- data/spec/adapter/autoit/mouse_spec.rb +53 -0
- data/spec/adapter/autoit/window_spec.rb +17 -0
- data/spec/adapter/ms_uia/button_spec.rb +39 -0
- data/spec/adapter/ms_uia/checkbox_spec.rb +55 -0
- data/spec/adapter/ms_uia/control_spec.rb +88 -0
- data/spec/adapter/ms_uia/functions_spec.rb +39 -0
- data/spec/adapter/ms_uia/keystroke_converter_spec.rb +48 -0
- data/spec/adapter/ms_uia/label_spec.rb +18 -0
- data/spec/adapter/ms_uia/list_item_spec.rb +14 -0
- data/spec/adapter/ms_uia/listbox_spec.rb +73 -0
- data/spec/adapter/ms_uia/radio_spec.rb +39 -0
- data/spec/adapter/ms_uia/select_list_spec.rb +118 -0
- data/spec/adapter/ms_uia/spinner_spec.rb +44 -0
- data/spec/adapter/ms_uia/tab_control_spec.rb +53 -0
- data/spec/adapter/ms_uia/table_spec.rb +197 -0
- data/spec/adapter/ms_uia/text_field_spec.rb +43 -0
- data/spec/adapter/ms_uia/value_control_spec.rb +11 -0
- data/spec/adapter/ms_uia/window_spec.rb +81 -0
- data/spec/adapter/win_32/button_spec.rb +31 -0
- data/spec/adapter/win_32/checkbox_spec.rb +46 -0
- data/spec/adapter/win_32/label_spec.rb +13 -0
- data/spec/adapter/win_32/listbox_spec.rb +41 -0
- data/spec/adapter/win_32/mouse_spec.rb +49 -0
- data/spec/adapter/win_32/radio_spec.rb +33 -0
- data/spec/adapter/win_32/select_list_spec.rb +65 -0
- data/spec/adapter/win_32/table_spec.rb +27 -0
- data/spec/adapter/win_32/text_field_spec.rb +24 -0
- data/spec/adapter/win_32/window_spec.rb +61 -0
- data/spec/button_spec.rb +67 -0
- data/spec/buttons_spec.rb +21 -0
- data/spec/spec_helper.rb +128 -0
- data/spec/text_field_spec.rb +64 -0
- data/spec/text_fields_spec.rb +22 -0
- data/spec/window_spec.rb +150 -0
- data/spec/windows_spec.rb +76 -0
- metadata +369 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Collections.Generic;
|
3
|
+
using System.Linq;
|
4
|
+
using System.Windows.Automation;
|
5
|
+
|
6
|
+
namespace RAutomation.UIA.Extensions
|
7
|
+
{
|
8
|
+
public static class Enumerable
|
9
|
+
{
|
10
|
+
public static IEnumerable<AutomationElement> Find(this AutomationElement automationElement, Condition condition)
|
11
|
+
{
|
12
|
+
return automationElement.Find(Condition.TrueCondition, condition);
|
13
|
+
}
|
14
|
+
|
15
|
+
public static IEnumerable<AutomationElement> Find(this AutomationElement automationElement, params Condition[] conditions)
|
16
|
+
{
|
17
|
+
return automationElement.FindAll(TreeScope.Subtree, new AndCondition(conditions)).AsEnumerable();
|
18
|
+
}
|
19
|
+
|
20
|
+
public static IEnumerable<AutomationElement> FindAny(this AutomationElement automationElement, params Condition[] conditions)
|
21
|
+
{
|
22
|
+
return automationElement.FindAll(TreeScope.Subtree, new OrCondition(conditions)).AsEnumerable();
|
23
|
+
}
|
24
|
+
|
25
|
+
public static AutomationElement FindOne(this AutomationElement automationElement, params Condition[] conditions)
|
26
|
+
{
|
27
|
+
return automationElement.FindFirst(TreeScope.Subtree, new AndCondition(conditions));
|
28
|
+
}
|
29
|
+
|
30
|
+
public static IEnumerable<string> Names(this IEnumerable<AutomationElement> automationElements)
|
31
|
+
{
|
32
|
+
return automationElements.Select(x => x.Current.Name);
|
33
|
+
}
|
34
|
+
|
35
|
+
public static IEnumerable<SelectionItemPattern> AsSelectionItems(this IEnumerable<AutomationElement> automationElements)
|
36
|
+
{
|
37
|
+
return automationElements.Select(Element.AsSelectionItem);
|
38
|
+
}
|
39
|
+
|
40
|
+
public static int IndexOf<T>(this IEnumerable<T> items, Func<T, bool> trueCondition)
|
41
|
+
{
|
42
|
+
var foundIndex = 0;
|
43
|
+
foreach (var item in items)
|
44
|
+
{
|
45
|
+
if (trueCondition(item)) return foundIndex;
|
46
|
+
++foundIndex;
|
47
|
+
}
|
48
|
+
|
49
|
+
return -1;
|
50
|
+
}
|
51
|
+
|
52
|
+
public static int[] IndexesOf<T>(this IEnumerable<T> items, Func<T, bool> trueCondition)
|
53
|
+
{
|
54
|
+
var indexes = new List<int>();
|
55
|
+
var foundIndex = 0;
|
56
|
+
foreach (var item in items)
|
57
|
+
{
|
58
|
+
if (trueCondition(item)) indexes.Add(foundIndex);
|
59
|
+
++foundIndex;
|
60
|
+
}
|
61
|
+
|
62
|
+
return indexes.ToArray();
|
63
|
+
}
|
64
|
+
|
65
|
+
public static void ForEach<T>(this IEnumerable<T> items, Action<T> doIt)
|
66
|
+
{
|
67
|
+
foreach (var item in items)
|
68
|
+
doIt(item);
|
69
|
+
}
|
70
|
+
|
71
|
+
public static IEnumerable<AutomationElement> AsEnumerable(this AutomationElementCollection automationElements)
|
72
|
+
{
|
73
|
+
return automationElements.Cast<AutomationElement>();
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
using System.Windows.Automation;
|
2
|
+
|
3
|
+
namespace RAutomation.UIA.Extensions
|
4
|
+
{
|
5
|
+
public static class Property
|
6
|
+
{
|
7
|
+
public static Condition Condition(this ControlType controlType)
|
8
|
+
{
|
9
|
+
return new PropertyCondition(AutomationElement.ControlTypeProperty, controlType);
|
10
|
+
}
|
11
|
+
|
12
|
+
public static Condition TrueCondition(this AutomationProperty property)
|
13
|
+
{
|
14
|
+
return new PropertyCondition(property, true);
|
15
|
+
}
|
16
|
+
|
17
|
+
public static Condition Is(this AutomationProperty property, object value)
|
18
|
+
{
|
19
|
+
return new PropertyCondition(property, value);
|
20
|
+
}
|
21
|
+
|
22
|
+
public static bool In(this AutomationProperty property, AutomationElement element)
|
23
|
+
{
|
24
|
+
return (bool) element.GetCurrentPropertyValue(property);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
using System.Reflection;
|
2
|
+
using System.Runtime.CompilerServices;
|
3
|
+
using System.Runtime.InteropServices;
|
4
|
+
|
5
|
+
// General Information about an assembly is controlled through the following
|
6
|
+
// set of attributes. Change these attribute values to modify the information
|
7
|
+
// associated with an assembly.
|
8
|
+
[assembly: AssemblyTitle("RAutomation.UIA")]
|
9
|
+
[assembly: AssemblyDescription("")]
|
10
|
+
[assembly: AssemblyConfiguration("")]
|
11
|
+
[assembly: AssemblyCompany("")]
|
12
|
+
[assembly: AssemblyProduct("RAutomation.UIA")]
|
13
|
+
[assembly: AssemblyCopyright("Copyright © 2013")]
|
14
|
+
[assembly: AssemblyTrademark("")]
|
15
|
+
[assembly: AssemblyCulture("")]
|
16
|
+
|
17
|
+
// Setting ComVisible to false makes the types in this assembly not visible
|
18
|
+
// to COM components. If you need to access a type in this assembly from
|
19
|
+
// COM, set the ComVisible attribute to true on that type.
|
20
|
+
[assembly: ComVisible(false)]
|
21
|
+
|
22
|
+
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
23
|
+
[assembly: Guid("8ef7f953-d78c-4088-abdb-1104f2300df8")]
|
24
|
+
|
25
|
+
// Version information for an assembly consists of the following four values:
|
26
|
+
//
|
27
|
+
// Major Version
|
28
|
+
// Minor Version
|
29
|
+
// Build Number
|
30
|
+
// Revision
|
31
|
+
//
|
32
|
+
// You can specify all the values or you can default the Build and Revision Numbers
|
33
|
+
// by using the '*' as shown below:
|
34
|
+
// [assembly: AssemblyVersion("1.0.*")]
|
35
|
+
[assembly: AssemblyVersion("1.0.0.0")]
|
36
|
+
[assembly: AssemblyFileVersion("1.0.0.0")]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
using System.Windows.Automation;
|
2
|
+
using RAutomation.UIA.Extensions;
|
3
|
+
|
4
|
+
namespace RAutomation.UIA.Properties
|
5
|
+
{
|
6
|
+
public class AutomationProperties
|
7
|
+
{
|
8
|
+
public static Condition IsSelectionItem
|
9
|
+
{
|
10
|
+
get { return new PropertyCondition(AutomationElement.IsSelectionItemPatternAvailableProperty, true); }
|
11
|
+
}
|
12
|
+
|
13
|
+
public static Condition IsDataItem
|
14
|
+
{
|
15
|
+
get { return ControlType.DataItem.Condition(); }
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
3
|
+
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
4
|
+
<PropertyGroup>
|
5
|
+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
6
|
+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
7
|
+
<ProjectGuid>{0834D9AE-B1AA-422B-B3B2-796C1C346301}</ProjectGuid>
|
8
|
+
<OutputType>Library</OutputType>
|
9
|
+
<AppDesignerFolder>Properties</AppDesignerFolder>
|
10
|
+
<RootNamespace>RAutomation.UIA</RootNamespace>
|
11
|
+
<AssemblyName>RAutomation.UIA</AssemblyName>
|
12
|
+
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
13
|
+
<FileAlignment>512</FileAlignment>
|
14
|
+
<TargetFrameworkProfile />
|
15
|
+
</PropertyGroup>
|
16
|
+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
17
|
+
<DebugSymbols>true</DebugSymbols>
|
18
|
+
<DebugType>full</DebugType>
|
19
|
+
<Optimize>false</Optimize>
|
20
|
+
<OutputPath>bin\Debug\</OutputPath>
|
21
|
+
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
22
|
+
<ErrorReport>prompt</ErrorReport>
|
23
|
+
<WarningLevel>4</WarningLevel>
|
24
|
+
</PropertyGroup>
|
25
|
+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
26
|
+
<DebugType>pdbonly</DebugType>
|
27
|
+
<Optimize>true</Optimize>
|
28
|
+
<OutputPath>bin\Release\</OutputPath>
|
29
|
+
<DefineConstants>TRACE</DefineConstants>
|
30
|
+
<ErrorReport>prompt</ErrorReport>
|
31
|
+
<WarningLevel>4</WarningLevel>
|
32
|
+
</PropertyGroup>
|
33
|
+
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
34
|
+
<PlatformTarget>x64</PlatformTarget>
|
35
|
+
<OutputPath>bin\x64\Debug\</OutputPath>
|
36
|
+
</PropertyGroup>
|
37
|
+
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
38
|
+
<PlatformTarget>x64</PlatformTarget>
|
39
|
+
<OutputPath>bin\x64\Release\</OutputPath>
|
40
|
+
<RegisterForComInterop>false</RegisterForComInterop>
|
41
|
+
</PropertyGroup>
|
42
|
+
<ItemGroup>
|
43
|
+
<Reference Include="System" />
|
44
|
+
<Reference Include="System.Core" />
|
45
|
+
<Reference Include="System.Drawing" />
|
46
|
+
<Reference Include="System.Windows.Forms" />
|
47
|
+
<Reference Include="System.Xml.Linq" />
|
48
|
+
<Reference Include="System.Data.DataSetExtensions" />
|
49
|
+
<Reference Include="System.Data" />
|
50
|
+
<Reference Include="System.Xml" />
|
51
|
+
<Reference Include="UIAutomationClient" />
|
52
|
+
<Reference Include="UIAutomationTypes" />
|
53
|
+
<Reference Include="WindowsBase" />
|
54
|
+
</ItemGroup>
|
55
|
+
<ItemGroup>
|
56
|
+
<Compile Include="Controls\Clicker.cs" />
|
57
|
+
<Compile Include="Controls\SelectList.cs" />
|
58
|
+
<Compile Include="Controls\Spinner.cs" />
|
59
|
+
<Compile Include="Controls\TabControl.cs" />
|
60
|
+
<Compile Include="Controls\TableControl.cs" />
|
61
|
+
<Compile Include="Controls\TextControl.cs" />
|
62
|
+
<Compile Include="Expander.cs" />
|
63
|
+
<Compile Include="Extensions\Property.cs" />
|
64
|
+
<Compile Include="Extensions\Enumerable.cs" />
|
65
|
+
<Compile Include="Extensions\Element.cs" />
|
66
|
+
<Compile Include="Properties\AssemblyInfo.cs" />
|
67
|
+
<Compile Include="Properties\AutomationProperties.cs" />
|
68
|
+
</ItemGroup>
|
69
|
+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
70
|
+
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
71
|
+
Other similar extension points exist, see Microsoft.Common.targets.
|
72
|
+
<Target Name="BeforeBuild">
|
73
|
+
</Target>
|
74
|
+
<Target Name="AfterBuild">
|
75
|
+
</Target>
|
76
|
+
-->
|
77
|
+
</Project>
|
Binary file
|
Binary file
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "ArrayHelper.h"
|
3
|
+
|
4
|
+
|
5
|
+
int ArrayHelper::Copy(array<int, 1>^ source, int destination[])
|
6
|
+
{
|
7
|
+
if( NULL != destination ) {
|
8
|
+
auto index = 0;
|
9
|
+
for each(auto value in source) {
|
10
|
+
destination[index++] = value;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
return source->Length;
|
14
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
|
3
|
+
using namespace System;
|
4
|
+
using namespace System::Reflection;
|
5
|
+
using namespace System::Runtime::CompilerServices;
|
6
|
+
using namespace System::Runtime::InteropServices;
|
7
|
+
using namespace System::Security::Permissions;
|
8
|
+
|
9
|
+
//
|
10
|
+
// General Information about an assembly is controlled through the following
|
11
|
+
// set of attributes. Change these attribute values to modify the information
|
12
|
+
// associated with an assembly.
|
13
|
+
//
|
14
|
+
[assembly:AssemblyTitleAttribute("UiaDll")];
|
15
|
+
[assembly:AssemblyDescriptionAttribute("")];
|
16
|
+
[assembly:AssemblyConfigurationAttribute("")];
|
17
|
+
[assembly:AssemblyCompanyAttribute("")];
|
18
|
+
[assembly:AssemblyProductAttribute("UiaDll")];
|
19
|
+
[assembly:AssemblyCopyrightAttribute("Copyright (c) 2012")];
|
20
|
+
[assembly:AssemblyTrademarkAttribute("")];
|
21
|
+
[assembly:AssemblyCultureAttribute("")];
|
22
|
+
|
23
|
+
//
|
24
|
+
// Version information for an assembly consists of the following four values:
|
25
|
+
//
|
26
|
+
// Major Version
|
27
|
+
// Minor Version
|
28
|
+
// Build Number
|
29
|
+
// Revision
|
30
|
+
//
|
31
|
+
// You can specify all the value or you can default the Revision and Build Numbers
|
32
|
+
// by using the '*' as shown below:
|
33
|
+
|
34
|
+
[assembly:AssemblyVersionAttribute("1.0.*")];
|
35
|
+
|
36
|
+
[assembly:ComVisible(false)];
|
37
|
+
|
38
|
+
[assembly:CLSCompliantAttribute(true)];
|
39
|
+
|
40
|
+
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
#include "Locator.h"
|
3
|
+
#include "StringHelper.h"
|
4
|
+
|
5
|
+
using namespace RAutomation::UIA::Extensions;
|
6
|
+
|
7
|
+
extern "C" {
|
8
|
+
__declspec ( dllexport ) void Control_GetValue(const FindInformation& findInformation, char* theValue, const int maximumLength) {
|
9
|
+
auto value = Element::Value(Locator::FindFor(findInformation));
|
10
|
+
StringHelper::CopyToUnmanagedString(value, theValue, maximumLength);
|
11
|
+
}
|
12
|
+
|
13
|
+
__declspec ( dllexport ) void Control_SetValue(const FindInformation& findInformation, const char* theValue) {
|
14
|
+
Element::SetValue(Locator::FindFor(findInformation), gcnew String(theValue));
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "DynamicAssemblyResolver.h"
|
3
|
+
|
4
|
+
void DynamicAssemblyResolver::PrivatePath::set(String^ path) {
|
5
|
+
_PrivatePath = path;
|
6
|
+
AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(Resolve);
|
7
|
+
}
|
8
|
+
|
9
|
+
Assembly^ DynamicAssemblyResolver::Resolve(Object^ sender, ResolveEventArgs^ args)
|
10
|
+
{
|
11
|
+
try
|
12
|
+
{
|
13
|
+
auto fullPrivatePath = Path::Combine(_PrivatePath, AssemblyFromQualifiedName(args->Name));
|
14
|
+
return Assembly::LoadFrom(fullPrivatePath);
|
15
|
+
}
|
16
|
+
catch(...) { }
|
17
|
+
|
18
|
+
return nullptr;
|
19
|
+
}
|
20
|
+
|
21
|
+
String^ DynamicAssemblyResolver::AssemblyFromQualifiedName(String^ qualifiedName)
|
22
|
+
{
|
23
|
+
return qualifiedName->Substring(0, qualifiedName->IndexOf(",")) + ".dll";
|
24
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#pragma once
|
2
|
+
using namespace System::IO;
|
3
|
+
using namespace System::Reflection;
|
4
|
+
|
5
|
+
ref class DynamicAssemblyResolver
|
6
|
+
{
|
7
|
+
public:
|
8
|
+
static property String^ PrivatePath {
|
9
|
+
void set(String^ value);
|
10
|
+
}
|
11
|
+
|
12
|
+
private:
|
13
|
+
static String^ _PrivatePath = nullptr;
|
14
|
+
static Assembly^ Resolve(Object^ sender, ResolveEventArgs^ args);
|
15
|
+
static String^ AssemblyFromQualifiedName(String^ qualifiedName);
|
16
|
+
};
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "Locator.h"
|
3
|
+
|
4
|
+
Locator::Locator(AutomationElement^ automationElement)
|
5
|
+
{
|
6
|
+
_automationElement = automationElement;
|
7
|
+
}
|
8
|
+
|
9
|
+
AutomationElement^ Locator::FindFor(const FindInformation& findInformation)
|
10
|
+
{
|
11
|
+
try {
|
12
|
+
auto finder = gcnew Locator(AutomationElement::FromHandle(IntPtr(findInformation.rootWindow)));
|
13
|
+
return finder->Find(findInformation);
|
14
|
+
} catch(Exception^) {
|
15
|
+
return nullptr;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
AutomationElementCollection^ Locator::Find(...array<Condition^>^ conditions)
|
20
|
+
{
|
21
|
+
return Find(Subtree, conditions);
|
22
|
+
}
|
23
|
+
|
24
|
+
AutomationElementCollection^ Locator::Find(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions)
|
25
|
+
{
|
26
|
+
return _automationElement->FindAll(scope, SomethingOrEverything(conditions));
|
27
|
+
}
|
28
|
+
|
29
|
+
AutomationElement^ Locator::FindFirst(...array<Condition^>^ conditions)
|
30
|
+
{
|
31
|
+
return FindFirst(Subtree, conditions);
|
32
|
+
}
|
33
|
+
|
34
|
+
AutomationElement^ Locator::FindFirst(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions)
|
35
|
+
{
|
36
|
+
return _automationElement->FindFirst(scope, SomethingOrEverything(conditions));
|
37
|
+
}
|
38
|
+
|
39
|
+
AutomationElement^ Locator::Find(const FindInformation& findInformation)
|
40
|
+
{
|
41
|
+
auto scope = findInformation.onlySearchChildren ? Children : Subtree;
|
42
|
+
|
43
|
+
switch(findInformation.how) {
|
44
|
+
case Id:
|
45
|
+
{
|
46
|
+
auto searchCondition = gcnew PropertyCondition(AutomationElement::AutomationIdProperty, gcnew String(findInformation.data.stringData));
|
47
|
+
if( 0 == findInformation.index ) {
|
48
|
+
return FindFirst(scope, searchCondition);
|
49
|
+
}
|
50
|
+
|
51
|
+
return FindAt(scope, findInformation.index, searchCondition);
|
52
|
+
}
|
53
|
+
case Value:
|
54
|
+
{
|
55
|
+
auto searchCondition = gcnew PropertyCondition(AutomationElement::NameProperty, gcnew String(findInformation.data.stringData));
|
56
|
+
|
57
|
+
if( 0 == findInformation.index ) {
|
58
|
+
return FindFirst(scope, searchCondition);
|
59
|
+
}
|
60
|
+
|
61
|
+
return FindAt(scope, findInformation.index, searchCondition);
|
62
|
+
}
|
63
|
+
case Focus:
|
64
|
+
return AutomationElement::FocusedElement;
|
65
|
+
case ScreenPoint:
|
66
|
+
return AutomationElement::FromPoint(Point(findInformation.data.pointData[0], findInformation.data.pointData[1]));
|
67
|
+
case Handle:
|
68
|
+
return AutomationElement::FromHandle(IntPtr(findInformation.data.intData));
|
69
|
+
}
|
70
|
+
|
71
|
+
return nullptr;
|
72
|
+
}
|
73
|
+
|
74
|
+
AutomationElement^ Locator::FindAt(const int whichItem, ...array<Condition^>^ conditions)
|
75
|
+
{
|
76
|
+
return FindAt(Subtree, whichItem, conditions);
|
77
|
+
}
|
78
|
+
|
79
|
+
AutomationElement^ Locator::FindAt(const UIAutomation::TreeScope scope, const int whichItem, ...array<Condition^>^ conditions)
|
80
|
+
{
|
81
|
+
return Find(scope, conditions)[whichItem];
|
82
|
+
}
|
83
|
+
|
84
|
+
Condition^ Locator::SomethingOrEverything(...array<Condition^>^ conditions)
|
85
|
+
{
|
86
|
+
if( conditions->Length == 0 ) {
|
87
|
+
return Condition::TrueCondition;
|
88
|
+
} else if( conditions->Length == 1 ) {
|
89
|
+
return conditions[0];
|
90
|
+
}
|
91
|
+
|
92
|
+
return gcnew AndCondition(conditions);
|
93
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#pragma once
|
2
|
+
using namespace System::Windows;
|
3
|
+
using namespace System::Windows::Automation;
|
4
|
+
|
5
|
+
ref class Locator
|
6
|
+
{
|
7
|
+
public:
|
8
|
+
static AutomationElement^ FindFor(const FindInformation& findInformation);
|
9
|
+
|
10
|
+
Locator(AutomationElement^ automationElement);
|
11
|
+
AutomationElement^ Find(const FindInformation& findInformation);
|
12
|
+
AutomationElementCollection^ Find(...array<Condition^>^ conditions);
|
13
|
+
AutomationElementCollection^ Find(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions);
|
14
|
+
AutomationElement^ FindFirst(...array<Condition^>^ conditions);
|
15
|
+
AutomationElement^ FindFirst(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions);
|
16
|
+
AutomationElement^ FindAt(const int whichItem, ...array<Condition^>^ conditions);
|
17
|
+
AutomationElement^ FindAt(const UIAutomation::TreeScope scope, const int whichItem, ...array<Condition^>^ conditions);
|
18
|
+
|
19
|
+
static property Condition^ IsSelectionItem {
|
20
|
+
Condition^ get() {
|
21
|
+
return gcnew PropertyCondition(AutomationElement::IsSelectionItemPatternAvailableProperty, true);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
static property Condition^ IsTableItem {
|
26
|
+
Condition^ get() {
|
27
|
+
return gcnew PropertyCondition(AutomationElement::IsTableItemPatternAvailableProperty, true);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
static property Condition^ IsDataItem {
|
32
|
+
Condition^ get() {
|
33
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::DataItem);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
static property Condition^ IsHeaderItem {
|
38
|
+
Condition^ get() {
|
39
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::HeaderItem);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
static property Condition^ IsListItem {
|
44
|
+
Condition^ get() {
|
45
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::ListItem);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
private:
|
50
|
+
static UIAutomation::TreeScope Subtree = UIAutomation::TreeScope::Subtree;
|
51
|
+
static UIAutomation::TreeScope Children = UIAutomation::TreeScope::Children;
|
52
|
+
AutomationElement^ _automationElement;
|
53
|
+
Condition^ SomethingOrEverything(...array<Condition^>^ conditions);
|
54
|
+
};
|
55
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "MenuItemSelector.h"
|
3
|
+
|
4
|
+
using namespace std;
|
5
|
+
|
6
|
+
void MenuItemSelector::SelectMenuPath(const HWND windowHandle, list<const char*>& menuItems)
|
7
|
+
{
|
8
|
+
auto automationElement = AutomationElement::FromHandle(IntPtr(windowHandle));
|
9
|
+
auto foundMenuItem = FindMenuItem(automationElement, menuItems);
|
10
|
+
auto invokePattern = dynamic_cast<InvokePattern^>(foundMenuItem->GetCurrentPattern(InvokePattern::Pattern));
|
11
|
+
invokePattern->Invoke();
|
12
|
+
}
|
13
|
+
|
14
|
+
BOOL MenuItemSelector::MenuItemExists(const HWND windowHandle, list<const char*>& menuItems)
|
15
|
+
{
|
16
|
+
try {
|
17
|
+
auto automationElement = AutomationElement::FromHandle(IntPtr(windowHandle));
|
18
|
+
return FindMenuItem(automationElement, menuItems) != nullptr;
|
19
|
+
} catch(Exception^) {
|
20
|
+
return FALSE;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
AutomationElement^ MenuItemSelector::FindMenuItem(AutomationElement^ rootElement, std::list<const char*>& menuItems)
|
25
|
+
{
|
26
|
+
auto foundMenuItem = rootElement;
|
27
|
+
|
28
|
+
for(list<const char*>::iterator menuItem = menuItems.begin(); menuItem != menuItems.end(); ++menuItem) {
|
29
|
+
foundMenuItem = GetNextMenuItem(foundMenuItem, gcnew String(*menuItem));
|
30
|
+
}
|
31
|
+
|
32
|
+
return foundMenuItem;
|
33
|
+
}
|
34
|
+
|
35
|
+
PropertyCondition^ MenuItemSelector::NameConditionFor(String^ name)
|
36
|
+
{
|
37
|
+
return gcnew PropertyCondition(AutomationElement::NameProperty, name);
|
38
|
+
}
|
39
|
+
|
40
|
+
AutomationElement^ MenuItemSelector::GetNextMenuItem(AutomationElement^ foundMenuItem, String^ nextMenu)
|
41
|
+
{
|
42
|
+
TryToExpand(AsExpandCollapse(foundMenuItem));
|
43
|
+
auto nextMenuItem = foundMenuItem->FindFirst(System::Windows::Automation::TreeScope::Subtree,
|
44
|
+
gcnew AndCondition(MenuItemControlType, NameConditionFor(nextMenu)));
|
45
|
+
if( nullptr == nextMenuItem ) {
|
46
|
+
throw gcnew Exception(String::Format("MenuItem with the text \"{0}\" does not exist", nextMenu));
|
47
|
+
}
|
48
|
+
return nextMenuItem;
|
49
|
+
}
|
50
|
+
|
51
|
+
ExpandCollapsePattern^ MenuItemSelector::AsExpandCollapse(AutomationElement^ foundMenuItem)
|
52
|
+
{
|
53
|
+
try
|
54
|
+
{
|
55
|
+
return dynamic_cast<ExpandCollapsePattern^>(foundMenuItem->GetCurrentPattern(ExpandCollapsePattern::Pattern));
|
56
|
+
}
|
57
|
+
catch(Exception^)
|
58
|
+
{
|
59
|
+
return nullptr;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
void MenuItemSelector::TryToExpand(ExpandCollapsePattern^ expandCollapsePattern)
|
64
|
+
{
|
65
|
+
if (nullptr == expandCollapsePattern) return;
|
66
|
+
|
67
|
+
try
|
68
|
+
{
|
69
|
+
expandCollapsePattern->Expand();
|
70
|
+
}
|
71
|
+
catch(Exception^)
|
72
|
+
{
|
73
|
+
expandCollapsePattern->Expand();
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#pragma once
|
2
|
+
#include "StringHelper.h"
|
3
|
+
|
4
|
+
using namespace System::Windows::Automation;
|
5
|
+
|
6
|
+
public ref class MenuItemSelector
|
7
|
+
{
|
8
|
+
public:
|
9
|
+
void SelectMenuPath(const HWND windowHandle, std::list<const char*>& menuItems);
|
10
|
+
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems);
|
11
|
+
|
12
|
+
private:
|
13
|
+
AutomationElement^ FindMenuItem(AutomationElement^ rootElement, std::list<const char*>& menuItems);
|
14
|
+
PropertyCondition^ NameConditionFor(String^ name);
|
15
|
+
AutomationElement^ GetNextMenuItem(AutomationElement^ foundMenuItem, String^ nextMenu);
|
16
|
+
ExpandCollapsePattern^ AsExpandCollapse(AutomationElement^ foundMenuItem);
|
17
|
+
void TryToExpand(ExpandCollapsePattern^ expandCollapsePattern);
|
18
|
+
|
19
|
+
property PropertyCondition^ MenuItemControlType {
|
20
|
+
private:
|
21
|
+
PropertyCondition^ get() { return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::MenuItem); }
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
#include "MenuItemSelector.h"
|
3
|
+
|
4
|
+
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems);
|
5
|
+
void MenuSelectPath(const HWND windowHandle, char* errorInfo, const int errorInfoSize, std::list<const char*>& menuItems);
|
6
|
+
|
7
|
+
extern "C" {
|
8
|
+
|
9
|
+
#pragma managed(push, off)
|
10
|
+
__declspec ( dllexport ) void Menu_SelectPath(const HWND windowHandle, char* errorInfo, const int errorInfoSize, const char* arg0, ...) {
|
11
|
+
va_list arguments;
|
12
|
+
va_start(arguments, arg0);
|
13
|
+
|
14
|
+
std::list<const char*> menuItems;
|
15
|
+
|
16
|
+
const char* lastArgument = arg0;
|
17
|
+
while( NULL != lastArgument ) {
|
18
|
+
menuItems.push_back(lastArgument);
|
19
|
+
lastArgument = va_arg(arguments, const char*);
|
20
|
+
}
|
21
|
+
va_end(arguments);
|
22
|
+
|
23
|
+
MenuSelectPath(windowHandle, errorInfo, errorInfoSize, menuItems);
|
24
|
+
}
|
25
|
+
#pragma managed(pop)
|
26
|
+
|
27
|
+
#pragma managed(push, off)
|
28
|
+
__declspec ( dllexport ) BOOL Menu_ItemExists(const HWND windowHandle, const char* arg0, ...) {
|
29
|
+
va_list arguments;
|
30
|
+
va_start(arguments, arg0);
|
31
|
+
|
32
|
+
std::list<const char*> menuItems;
|
33
|
+
|
34
|
+
const char* lastArgument = arg0;
|
35
|
+
while( NULL != lastArgument ) {
|
36
|
+
menuItems.push_back(lastArgument);
|
37
|
+
lastArgument = va_arg(arguments, const char*);
|
38
|
+
}
|
39
|
+
va_end(arguments);
|
40
|
+
|
41
|
+
return MenuItemExists(windowHandle, menuItems);
|
42
|
+
}
|
43
|
+
#pragma managed(pop)
|
44
|
+
}
|
45
|
+
|
46
|
+
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems)
|
47
|
+
{
|
48
|
+
auto menuSelector = gcnew MenuItemSelector();
|
49
|
+
return menuSelector->MenuItemExists(windowHandle, menuItems);
|
50
|
+
}
|
51
|
+
|
52
|
+
void MenuSelectPath(const HWND windowHandle, char* errorInfo, const int errorInfoSize, std::list<const char*>& menuItems)
|
53
|
+
{
|
54
|
+
try {
|
55
|
+
auto menuSelector = gcnew MenuItemSelector();
|
56
|
+
menuSelector->SelectMenuPath(windowHandle, menuItems);
|
57
|
+
} catch(Exception^ e) {
|
58
|
+
if( errorInfo ) {
|
59
|
+
StringHelper::CopyToUnmanagedString(e->ToString(), errorInfo, errorInfoSize);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|