rautomation 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/History.rdoc +7 -1
- data/VERSION +1 -1
- data/ext/UiaDll/RAutomation.UIA/Controls/Clicker.cs +59 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/SelectList.cs +76 -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 +87 -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 +108 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Enumerable.cs +63 -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 +68 -0
- data/ext/UiaDll/UiaDll.sln +24 -2
- data/ext/UiaDll/UiaDll/ControlMethods.cpp +6 -5
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.cpp +24 -0
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.h +16 -0
- data/ext/UiaDll/UiaDll/{AutomationFinder.cpp → Locator.cpp} +25 -15
- data/ext/UiaDll/UiaDll/{AutomationFinder.h → Locator.h} +4 -2
- data/ext/UiaDll/UiaDll/MenuItemSelector.cpp +3 -3
- data/ext/UiaDll/UiaDll/MenuMethods.cpp +4 -0
- data/ext/UiaDll/UiaDll/SelectListMethods.cpp +40 -21
- data/ext/UiaDll/UiaDll/SpinnerMethods.cpp +61 -0
- data/ext/UiaDll/UiaDll/StringHelper.cpp +13 -1
- data/ext/UiaDll/UiaDll/StringHelper.h +1 -0
- data/ext/UiaDll/UiaDll/TabControlMethods.cpp +11 -8
- data/ext/UiaDll/UiaDll/TableMethods.cpp +20 -21
- data/ext/UiaDll/UiaDll/TextMethods.cpp +19 -17
- data/ext/UiaDll/UiaDll/UiaDll.cpp +191 -342
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj +11 -21
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +22 -115
- data/ext/UiaDll/UiaDll/dllmain.cpp +1 -21
- data/ext/UiaDll/UiaDll/stdafx.h +0 -2
- data/ext/WindowsForms/WindowsForms/DataEntryForm.Designer.cs +17 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.cs +2 -6
- data/ext/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +6 -7
- data/ext/WindowsForms/WindowsForms/MainFormWindow.cs +2 -0
- data/ext/WindowsForms/WindowsForms/UIA.Extensions.dll +0 -0
- data/ext/WindowsForms/WindowsForms/ValueMonthCalendar.cs +28 -0
- data/ext/WindowsForms/WindowsForms/WindowsForms.csproj +5 -4
- data/lib/rautomation/adapter/ms_uia.rb +1 -0
- data/lib/rautomation/adapter/ms_uia/control.rb +1 -13
- data/lib/rautomation/adapter/ms_uia/functions.rb +2 -16
- data/lib/rautomation/adapter/ms_uia/list_box.rb +2 -2
- data/lib/rautomation/adapter/ms_uia/spinner.rb +31 -0
- data/lib/rautomation/adapter/ms_uia/uia_dll.rb +59 -31
- data/lib/rautomation/adapter/ms_uia/window.rb +5 -4
- data/rautomation.gemspec +1 -0
- data/spec/adapter/ms_uia/spinner_spec.rb +44 -0
- data/spec/adapter/ms_uia/value_control_spec.rb +2 -2
- metadata +26 -25
- data/ext/UiaDll/UiaDll/AutomatedSelectList.cpp +0 -93
- data/ext/UiaDll/UiaDll/AutomatedSelectList.h +0 -47
- data/ext/UiaDll/UiaDll/AutomatedTabControl.cpp +0 -45
- data/ext/UiaDll/UiaDll/AutomatedTabControl.h +0 -41
- data/ext/UiaDll/UiaDll/AutomatedTable.cpp +0 -92
- data/ext/UiaDll/UiaDll/AutomatedTable.h +0 -35
- data/ext/UiaDll/UiaDll/AutomatedText.cpp +0 -22
- data/ext/UiaDll/UiaDll/AutomatedText.h +0 -26
- data/ext/UiaDll/UiaDll/AutomationClicker.cpp +0 -53
- data/ext/UiaDll/UiaDll/AutomationClicker.h +0 -30
- data/ext/UiaDll/UiaDll/AutomationControl.cpp +0 -40
- data/ext/UiaDll/UiaDll/AutomationControl.h +0 -75
- data/ext/UiaDll/UiaDll/ExpandCollapseHelper.cpp +0 -53
- data/ext/UiaDll/UiaDll/ExpandCollapseHelper.h +0 -25
- data/ext/UiaDll/UiaDll/SelectionItem.cpp +0 -10
- data/ext/UiaDll/UiaDll/SelectionItem.h +0 -21
- data/ext/UiaDll/UiaDll/Toggle.cpp +0 -2
- data/ext/UiaDll/UiaDll/Toggle.h +0 -22
- data/ext/UiaDll/UiaDll/globals.h +0 -3
- data/ext/WindowsForms/WindowsForms/AutomatableMonthCalendar.cs +0 -59
- data/ext/WindowsForms/WindowsForms/AutomationHelpers/AutomationProvider.cs +0 -91
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
using System.Windows;
|
|
2
|
+
using System.Windows.Automation;
|
|
3
|
+
|
|
4
|
+
namespace RAutomation.UIA.Extensions
|
|
5
|
+
{
|
|
6
|
+
public static class Element
|
|
7
|
+
{
|
|
8
|
+
public static SelectionItemPattern AsSelectionItem(this AutomationElement automationElement)
|
|
9
|
+
{
|
|
10
|
+
return (SelectionItemPattern)automationElement.GetCurrentPattern(SelectionItemPattern.Pattern);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public static bool Exists(this AutomationElement automationElement)
|
|
14
|
+
{
|
|
15
|
+
return null != automationElement;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public static string Name(this AutomationElement automationElement)
|
|
19
|
+
{
|
|
20
|
+
return automationElement.Current.Name;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public static string ClassName(this AutomationElement automationElement)
|
|
24
|
+
{
|
|
25
|
+
return automationElement.Current.ClassName;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public static bool IsEnabled(this AutomationElement automationElement)
|
|
29
|
+
{
|
|
30
|
+
return automationElement.Current.IsEnabled;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static bool IsFocused(this AutomationElement automationElement)
|
|
34
|
+
{
|
|
35
|
+
return automationElement.Current.HasKeyboardFocus;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static int NativeWindowHandle(this AutomationElement automationElement)
|
|
39
|
+
{
|
|
40
|
+
return automationElement.Exists() ? automationElement.Current.NativeWindowHandle : 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public static Rect BoundingRectangle(this AutomationElement automationElement)
|
|
44
|
+
{
|
|
45
|
+
return automationElement.Current.BoundingRectangle;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public static ControlType ControlType(this AutomationElement automationElement)
|
|
49
|
+
{
|
|
50
|
+
return automationElement.Current.ControlType;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public static int ProcessId(this AutomationElement automationElement)
|
|
54
|
+
{
|
|
55
|
+
return automationElement.Current.ProcessId;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public static bool IsSelected(this AutomationElement automationElement)
|
|
59
|
+
{
|
|
60
|
+
return automationElement.AsSelectionItem().Current.IsSelected;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public static bool IsOffscreen(this AutomationElement automationElement)
|
|
64
|
+
{
|
|
65
|
+
return automationElement.Current.IsOffscreen;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public static TogglePattern AsTogglePattern(this AutomationElement automationElement)
|
|
69
|
+
{
|
|
70
|
+
return (TogglePattern)automationElement.GetCurrentPattern(TogglePattern.Pattern);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public static bool IsToggled(this AutomationElement automationElement)
|
|
74
|
+
{
|
|
75
|
+
return automationElement.AsTogglePattern().Current.ToggleState == ToggleState.On;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public static string Value(this AutomationElement automationElement)
|
|
79
|
+
{
|
|
80
|
+
return automationElement.AsValuePattern().Current.Value;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public static void SetValue(this AutomationElement automationElement, string value)
|
|
84
|
+
{
|
|
85
|
+
automationElement.AsValuePattern().SetValue(value);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public static bool IsValuePattern(this AutomationElement automationElement)
|
|
89
|
+
{
|
|
90
|
+
return (bool) automationElement.GetCurrentPropertyValue(AutomationElement.IsValuePatternAvailableProperty);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public static ValuePattern AsValuePattern(this AutomationElement automationElement)
|
|
94
|
+
{
|
|
95
|
+
return (ValuePattern) automationElement.GetCurrentPattern(ValuePattern.Pattern);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public static TextPattern AsTextPattern(this AutomationElement automationElement)
|
|
99
|
+
{
|
|
100
|
+
return (TextPattern) automationElement.GetCurrentPattern(TextPattern.Pattern);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public static T As<T>(this AutomationElement automationElement, AutomationPattern pattern)
|
|
104
|
+
{
|
|
105
|
+
return (T) automationElement.GetCurrentPattern(pattern);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
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 void ForEach<T>(this IEnumerable<T> items, Action<T> doIt)
|
|
53
|
+
{
|
|
54
|
+
foreach (var item in items)
|
|
55
|
+
doIt(item);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public static IEnumerable<AutomationElement> AsEnumerable(this AutomationElementCollection automationElements)
|
|
59
|
+
{
|
|
60
|
+
return automationElements.Cast<AutomationElement>();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -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,68 @@
|
|
|
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
|
+
<ItemGroup>
|
|
34
|
+
<Reference Include="System" />
|
|
35
|
+
<Reference Include="System.Core" />
|
|
36
|
+
<Reference Include="System.Drawing" />
|
|
37
|
+
<Reference Include="System.Windows.Forms" />
|
|
38
|
+
<Reference Include="System.Xml.Linq" />
|
|
39
|
+
<Reference Include="System.Data.DataSetExtensions" />
|
|
40
|
+
<Reference Include="System.Data" />
|
|
41
|
+
<Reference Include="System.Xml" />
|
|
42
|
+
<Reference Include="UIAutomationClient" />
|
|
43
|
+
<Reference Include="UIAutomationTypes" />
|
|
44
|
+
<Reference Include="WindowsBase" />
|
|
45
|
+
</ItemGroup>
|
|
46
|
+
<ItemGroup>
|
|
47
|
+
<Compile Include="Controls\Clicker.cs" />
|
|
48
|
+
<Compile Include="Controls\SelectList.cs" />
|
|
49
|
+
<Compile Include="Controls\Spinner.cs" />
|
|
50
|
+
<Compile Include="Controls\TabControl.cs" />
|
|
51
|
+
<Compile Include="Controls\TableControl.cs" />
|
|
52
|
+
<Compile Include="Controls\TextControl.cs" />
|
|
53
|
+
<Compile Include="Expander.cs" />
|
|
54
|
+
<Compile Include="Extensions\Property.cs" />
|
|
55
|
+
<Compile Include="Extensions\Enumerable.cs" />
|
|
56
|
+
<Compile Include="Extensions\Element.cs" />
|
|
57
|
+
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
58
|
+
<Compile Include="Properties\AutomationProperties.cs" />
|
|
59
|
+
</ItemGroup>
|
|
60
|
+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
61
|
+
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
62
|
+
Other similar extension points exist, see Microsoft.Common.targets.
|
|
63
|
+
<Target Name="BeforeBuild">
|
|
64
|
+
</Target>
|
|
65
|
+
<Target Name="AfterBuild">
|
|
66
|
+
</Target>
|
|
67
|
+
-->
|
|
68
|
+
</Project>
|
data/ext/UiaDll/UiaDll.sln
CHANGED
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
|
|
2
|
-
Microsoft Visual Studio Solution File, Format Version
|
|
3
|
-
# Visual Studio
|
|
2
|
+
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
3
|
+
# Visual Studio 2012
|
|
4
4
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UiaDll", "UiaDll\UiaDll.vcxproj", "{4A06195F-8D10-4384-97C3-86D512C40DE4}"
|
|
5
5
|
EndProject
|
|
6
|
+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RAutomation.UIA", "RAutomation.UIA\RAutomation.UIA.csproj", "{0834D9AE-B1AA-422B-B3B2-796C1C346301}"
|
|
7
|
+
EndProject
|
|
6
8
|
Global
|
|
7
9
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
10
|
+
Debug|Any CPU = Debug|Any CPU
|
|
11
|
+
Debug|Mixed Platforms = Debug|Mixed Platforms
|
|
8
12
|
Debug|Win32 = Debug|Win32
|
|
13
|
+
Release|Any CPU = Release|Any CPU
|
|
14
|
+
Release|Mixed Platforms = Release|Mixed Platforms
|
|
9
15
|
Release|Win32 = Release|Win32
|
|
10
16
|
EndGlobalSection
|
|
11
17
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
18
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
19
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
|
20
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
|
12
21
|
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
13
22
|
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Debug|Win32.Build.0 = Debug|Win32
|
|
23
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
24
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
|
25
|
+
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Release|Mixed Platforms.Build.0 = Release|Win32
|
|
14
26
|
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Release|Win32.ActiveCfg = Release|Win32
|
|
15
27
|
{4A06195F-8D10-4384-97C3-86D512C40DE4}.Release|Win32.Build.0 = Release|Win32
|
|
28
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
29
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
30
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
31
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
32
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
|
33
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
34
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
35
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
36
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
37
|
+
{0834D9AE-B1AA-422B-B3B2-796C1C346301}.Release|Win32.ActiveCfg = Release|Any CPU
|
|
16
38
|
EndGlobalSection
|
|
17
39
|
GlobalSection(SolutionProperties) = preSolution
|
|
18
40
|
HideSolutionNode = FALSE
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#include "stdafx.h"
|
|
2
|
-
#include "
|
|
2
|
+
#include "Locator.h"
|
|
3
3
|
#include "StringHelper.h"
|
|
4
4
|
|
|
5
|
+
using namespace RAutomation::UIA::Extensions;
|
|
6
|
+
|
|
5
7
|
extern "C" {
|
|
6
8
|
__declspec ( dllexport ) void Control_GetValue(const FindInformation& findInformation, char* theValue, const int maximumLength) {
|
|
7
|
-
auto
|
|
8
|
-
StringHelper::CopyToUnmanagedString(
|
|
9
|
+
auto value = Element::Value(Locator::FindFor(findInformation));
|
|
10
|
+
StringHelper::CopyToUnmanagedString(value, theValue, maximumLength);
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
__declspec ( dllexport ) void Control_SetValue(const FindInformation& findInformation, const char* theValue) {
|
|
12
|
-
|
|
13
|
-
control->Value = gcnew String(theValue);
|
|
14
|
+
Element::SetValue(Locator::FindFor(findInformation), gcnew String(theValue));
|
|
14
15
|
}
|
|
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
|
+
};
|
|
@@ -1,37 +1,47 @@
|
|
|
1
1
|
#include "StdAfx.h"
|
|
2
|
-
#include "
|
|
2
|
+
#include "Locator.h"
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Locator::Locator(AutomationElement^ automationElement)
|
|
5
5
|
{
|
|
6
6
|
_automationElement = automationElement;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
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)
|
|
10
20
|
{
|
|
11
21
|
return Find(Subtree, conditions);
|
|
12
22
|
}
|
|
13
23
|
|
|
14
|
-
AutomationElementCollection^
|
|
24
|
+
AutomationElementCollection^ Locator::Find(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions)
|
|
15
25
|
{
|
|
16
26
|
return _automationElement->FindAll(scope, SomethingOrEverything(conditions));
|
|
17
27
|
}
|
|
18
28
|
|
|
19
|
-
AutomationElement^
|
|
29
|
+
AutomationElement^ Locator::FindFirst(...array<Condition^>^ conditions)
|
|
20
30
|
{
|
|
21
31
|
return FindFirst(Subtree, conditions);
|
|
22
32
|
}
|
|
23
33
|
|
|
24
|
-
AutomationElement^
|
|
34
|
+
AutomationElement^ Locator::FindFirst(const UIAutomation::TreeScope scope, ...array<Condition^>^ conditions)
|
|
25
35
|
{
|
|
26
36
|
return _automationElement->FindFirst(scope, SomethingOrEverything(conditions));
|
|
27
37
|
}
|
|
28
38
|
|
|
29
|
-
AutomationElement^
|
|
39
|
+
AutomationElement^ Locator::Find(const FindInformation& findInformation)
|
|
30
40
|
{
|
|
31
41
|
auto scope = findInformation.onlySearchChildren ? Children : Subtree;
|
|
32
42
|
|
|
33
43
|
switch(findInformation.how) {
|
|
34
|
-
case
|
|
44
|
+
case Id:
|
|
35
45
|
{
|
|
36
46
|
auto searchCondition = gcnew PropertyCondition(AutomationElement::AutomationIdProperty, gcnew String(findInformation.data.stringData));
|
|
37
47
|
if( 0 == findInformation.index ) {
|
|
@@ -40,7 +50,7 @@ AutomationElement^ AutomationFinder::Find(const FindInformation& findInformation
|
|
|
40
50
|
|
|
41
51
|
return FindAt(scope, findInformation.index, searchCondition);
|
|
42
52
|
}
|
|
43
|
-
case
|
|
53
|
+
case Value:
|
|
44
54
|
{
|
|
45
55
|
auto searchCondition = gcnew PropertyCondition(AutomationElement::NameProperty, gcnew String(findInformation.data.stringData));
|
|
46
56
|
|
|
@@ -50,28 +60,28 @@ AutomationElement^ AutomationFinder::Find(const FindInformation& findInformation
|
|
|
50
60
|
|
|
51
61
|
return FindAt(scope, findInformation.index, searchCondition);
|
|
52
62
|
}
|
|
53
|
-
case
|
|
63
|
+
case Focus:
|
|
54
64
|
return AutomationElement::FocusedElement;
|
|
55
|
-
case
|
|
65
|
+
case ScreenPoint:
|
|
56
66
|
return AutomationElement::FromPoint(Point(findInformation.data.pointData[0], findInformation.data.pointData[1]));
|
|
57
|
-
case
|
|
67
|
+
case Handle:
|
|
58
68
|
return AutomationElement::FromHandle(IntPtr(findInformation.data.intData));
|
|
59
69
|
}
|
|
60
70
|
|
|
61
71
|
return nullptr;
|
|
62
72
|
}
|
|
63
73
|
|
|
64
|
-
AutomationElement^
|
|
74
|
+
AutomationElement^ Locator::FindAt(const int whichItem, ...array<Condition^>^ conditions)
|
|
65
75
|
{
|
|
66
76
|
return FindAt(Subtree, whichItem, conditions);
|
|
67
77
|
}
|
|
68
78
|
|
|
69
|
-
AutomationElement^
|
|
79
|
+
AutomationElement^ Locator::FindAt(const UIAutomation::TreeScope scope, const int whichItem, ...array<Condition^>^ conditions)
|
|
70
80
|
{
|
|
71
81
|
return Find(scope, conditions)[whichItem];
|
|
72
82
|
}
|
|
73
83
|
|
|
74
|
-
Condition^
|
|
84
|
+
Condition^ Locator::SomethingOrEverything(...array<Condition^>^ conditions)
|
|
75
85
|
{
|
|
76
86
|
if( conditions->Length == 0 ) {
|
|
77
87
|
return Condition::TrueCondition;
|