rautomation 0.8.0 → 0.9.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 +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/History.rdoc +17 -0
- data/README.rdoc +2 -1
- data/Rakefile +23 -6
- data/VERSION +1 -1
- data/ext/IAccessibleDLL/Release/IAccessibleDLL.dll +0 -0
- data/ext/UiaDll/Release/UiaDll.dll +0 -0
- data/ext/UiaDll/UiaDll/{AutomatedComboBox.cpp → AutomatedSelectList.cpp} +22 -11
- data/ext/UiaDll/UiaDll/{AutomatedComboBox.h → AutomatedSelectList.h} +17 -4
- data/ext/UiaDll/UiaDll/AutomatedTable.cpp +55 -13
- data/ext/UiaDll/UiaDll/AutomatedTable.h +16 -3
- data/ext/UiaDll/UiaDll/AutomationControl.cpp +28 -0
- data/ext/UiaDll/UiaDll/AutomationControl.h +56 -0
- data/ext/UiaDll/UiaDll/AutomationFinder.cpp +57 -0
- data/ext/UiaDll/UiaDll/AutomationFinder.h +48 -0
- data/ext/UiaDll/UiaDll/ControlMethods.cpp +15 -0
- data/ext/UiaDll/UiaDll/MenuItemSelector.h +2 -0
- data/ext/UiaDll/UiaDll/MenuMethods.cpp +58 -0
- data/ext/UiaDll/UiaDll/SelectListMethods.cpp +37 -0
- data/ext/UiaDll/UiaDll/SelectionItem.cpp +10 -0
- data/ext/UiaDll/UiaDll/SelectionItem.h +21 -0
- data/ext/UiaDll/UiaDll/StringHelper.cpp +33 -2
- data/ext/UiaDll/UiaDll/StringHelper.h +6 -0
- data/ext/UiaDll/UiaDll/StringMethods.cpp +8 -0
- data/ext/UiaDll/UiaDll/TableMethods.cpp +76 -0
- data/ext/UiaDll/UiaDll/Toggle.cpp +2 -0
- data/ext/UiaDll/UiaDll/Toggle.h +22 -0
- data/ext/UiaDll/UiaDll/UiaDll.cpp +96 -327
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj +15 -4
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +91 -22
- data/ext/UiaDll/UiaDll/dllmain.cpp +1 -1
- data/ext/UiaDll/UiaDll/stdafx.h +38 -21
- data/ext/WindowsForms/Release/WindowsForms.exe +0 -0
- data/ext/WindowsForms/WindowsForms.sln +10 -0
- data/ext/WindowsForms/WindowsForms/AutomatableMonthCalendar.cs +59 -0
- data/ext/WindowsForms/WindowsForms/AutomationHelpers/AutomationProvider.cs +91 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +32 -10
- data/ext/WindowsForms/WindowsForms/MainFormWindow.cs +10 -0
- data/ext/WindowsForms/WindowsForms/WindowsForms.csproj +15 -6
- data/lib/rautomation/adapter/ms_uia.rb +1 -0
- data/lib/rautomation/adapter/ms_uia/checkbox.rb +2 -10
- data/lib/rautomation/adapter/ms_uia/constants.rb +1 -0
- data/lib/rautomation/adapter/ms_uia/control.rb +14 -67
- data/lib/rautomation/adapter/ms_uia/functions.rb +2 -18
- data/lib/rautomation/adapter/ms_uia/list_box.rb +5 -27
- data/lib/rautomation/adapter/ms_uia/list_item.rb +2 -29
- data/lib/rautomation/adapter/ms_uia/radio.rb +1 -1
- data/lib/rautomation/adapter/ms_uia/select_list.rb +5 -6
- data/lib/rautomation/adapter/ms_uia/table.rb +15 -50
- data/lib/rautomation/adapter/ms_uia/text_field.rb +1 -1
- data/lib/rautomation/adapter/ms_uia/uia_dll.rb +226 -58
- data/lib/rautomation/adapter/ms_uia/value_control.rb +21 -0
- data/lib/rautomation/adapter/ms_uia/window.rb +6 -104
- data/lib/rautomation/adapter/win_32/functions.rb +0 -23
- data/lib/rautomation/adapter/win_32/keys.rb +64 -61
- data/rautomation.gemspec +6 -1
- data/spec/adapter/autoit/mouse_spec.rb +1 -1
- data/spec/adapter/ms_uia/select_list_spec.rb +0 -21
- data/spec/adapter/ms_uia/table_spec.rb +13 -11
- data/spec/adapter/ms_uia/text_field_spec.rb +15 -8
- data/spec/adapter/ms_uia/value_control_spec.rb +11 -0
- data/spec/adapter/ms_uia/window_spec.rb +7 -1
- data/spec/adapter/win_32/mouse_spec.rb +1 -1
- data/spec/adapter/win_32/text_field_spec.rb +5 -5
- data/spec/adapter/win_32/window_spec.rb +1 -1
- data/spec/text_field_spec.rb +18 -23
- data/spec/window_spec.rb +1 -3
- metadata +45 -34
- data/ext/UiaDll/UiaDll/ToggleStateHelper.cpp +0 -33
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cd70f4859a5f1f16541465e836d116265af26eb4
|
4
|
+
data.tar.gz: 7bae3a8bc91207cdfa3e302ffdbde778ead2ac69
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ea5fd4f9d351eec5ffe23f207ab5f6679d861d410adc6fe908902497195c3ce776deff5c1428afd884c9bd8ef62a1f57d11da968bad26e2ca638afaea06dc529
|
7
|
+
data.tar.gz: f9c6a60d917eeef6178a4fdc9f3f68d8cbd04e8ee4d6194130859036d243cb842167a68900cc2ad811659099ca682c08ccfa30763f8aa6d0a1e4a491744e9d1c
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rautomation (0.
|
4
|
+
rautomation (0.9.0)
|
5
5
|
ffi
|
6
6
|
|
7
7
|
GEM
|
8
|
-
remote:
|
8
|
+
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.1.3)
|
11
|
-
ffi (1.
|
11
|
+
ffi (1.7.0-x86-mingw32)
|
12
12
|
rake (0.9.2.2)
|
13
13
|
rspec (2.8.0)
|
14
14
|
rspec-core (~> 2.8.0)
|
data/History.rdoc
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
== 0.9.0 / 2013-04-22
|
2
|
+
|
3
|
+
=== MsUia adapter
|
4
|
+
|
5
|
+
* Add support for :name locator.
|
6
|
+
* Add support for Window#value_control.
|
7
|
+
* Add Table#headers.
|
8
|
+
* Add Table#values.
|
9
|
+
* Control#exists? uses now uia code.
|
10
|
+
* ControlType.Document is also considered as a TextField.
|
11
|
+
* Table#select and Table#selected? use 0-based indexing.
|
12
|
+
* Table#select supports value too.
|
13
|
+
|
14
|
+
=== Win32 adapter
|
15
|
+
|
16
|
+
* Add support for "[", "]" and "'" characters when using Window#send_keys. Fixes #61.
|
17
|
+
|
1
18
|
== 0.8.0 / 2012-12-26
|
2
19
|
|
3
20
|
=== MsUia adapter
|
data/README.rdoc
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
= RAutomation
|
2
|
+
{<img src="https://badge.fury.io/rb/rautomation.png" alt="Gem Version" />}[http://badge.fury.io/rb/rautomation]
|
2
3
|
|
3
4
|
* Web: http://www.github.com/jarmo/RAutomation
|
4
5
|
* Author: Jarmo Pertman (mailto:jarmo.p[at]gmail.com)
|
5
6
|
|
6
|
-
{<img alt='Click here to lend your support to: RAutomation and make a donation at www.pledgie.com !' src='https://
|
7
|
+
{<img alt='Click here to lend your support to: RAutomation and make a donation at www.pledgie.com !' src='https://pledgie.com/campaigns/16196.png?skin_name=chrome' />}[https://pledgie.com/campaigns/16196]
|
7
8
|
|
8
9
|
RAutomation is a small and easy to use library for helping out to automate windows and their controls
|
9
10
|
for automated testing.
|
data/Rakefile
CHANGED
@@ -3,18 +3,31 @@ require 'bundler'
|
|
3
3
|
|
4
4
|
Bundler::GemHelper.install_tasks
|
5
5
|
|
6
|
+
def ext_dependencies(name)
|
7
|
+
FileList["ext/#{name}/**/*"].reject { |file| file =~ /\b(Release|Debug)\b/ }
|
8
|
+
end
|
9
|
+
|
10
|
+
def ms_build(name)
|
11
|
+
name = File.basename(name, File.extname(name))
|
12
|
+
sh "msbuild /property:Configuration=Release ext\\#{name}\\#{name}.sln"
|
13
|
+
end
|
14
|
+
|
6
15
|
namespace :build do
|
7
16
|
build_tasks = [
|
8
|
-
{:name => :uia_dll, :path => "UiaDll"},
|
9
|
-
{:name => :i_accessible_dll, :path => "IAccessibleDLL"},
|
10
|
-
{:name => :windows_forms, :path => "WindowsForms"}
|
17
|
+
{:name => :uia_dll, :path => "UiaDll", :ext => "dll"},
|
18
|
+
{:name => :i_accessible_dll, :path => "IAccessibleDLL", :ext => "dll"},
|
19
|
+
{:name => :windows_forms, :path => "WindowsForms", :ext => "exe"}
|
11
20
|
]
|
12
21
|
|
13
22
|
build_tasks.each do |build_task|
|
14
|
-
|
15
|
-
|
16
|
-
|
23
|
+
full_ext_path = "ext/#{build_task[:path]}/Release/#{build_task[:path]}.#{build_task[:ext]}"
|
24
|
+
|
25
|
+
file full_ext_path => ext_dependencies(build_task[:path]) do |t|
|
26
|
+
ms_build t.name
|
17
27
|
end
|
28
|
+
|
29
|
+
desc "Build #{build_task[:path]}"
|
30
|
+
task build_task[:name] => full_ext_path
|
18
31
|
end
|
19
32
|
|
20
33
|
desc "Build all external dependencies"
|
@@ -51,3 +64,7 @@ require 'yard'
|
|
51
64
|
YARD::Rake::YardocTask.new
|
52
65
|
|
53
66
|
task :default => "spec:all"
|
67
|
+
|
68
|
+
task :release => "spec:all"
|
69
|
+
|
70
|
+
task :install => :build
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
Binary file
|
Binary file
|
@@ -1,15 +1,26 @@
|
|
1
1
|
#include "StdAfx.h"
|
2
|
-
#include "
|
2
|
+
#include "AutomatedSelectList.h"
|
3
3
|
|
4
|
-
|
5
|
-
{
|
6
|
-
|
4
|
+
AutomatedSelectList::AutomatedSelectList(const HWND windowHandle) : AutomationControl(windowHandle)
|
5
|
+
{ }
|
6
|
+
|
7
|
+
AutomatedSelectList::AutomatedSelectList(const FindInformation& findInformation) : AutomationControl(findInformation)
|
8
|
+
{ }
|
9
|
+
|
10
|
+
array<String^>^ AutomatedSelectList::Selection::get() {
|
11
|
+
auto selectedElements = AsSelectionPattern->Current.GetSelection();
|
12
|
+
auto selections = gcnew array<String^>(selectedElements.Length);
|
13
|
+
auto whichOne = 0;
|
14
|
+
for each(auto element in selectedElements) {
|
15
|
+
selections[whichOne++] = element->Current.Name;
|
16
|
+
}
|
17
|
+
return selections;
|
7
18
|
}
|
8
19
|
|
9
|
-
bool
|
20
|
+
bool AutomatedSelectList::SelectByIndex(const int whichItem)
|
10
21
|
{
|
11
22
|
try {
|
12
|
-
auto selectionItems =
|
23
|
+
auto selectionItems = _control->FindAll(System::Windows::Automation::TreeScope::Subtree, SelectionCondition);
|
13
24
|
Select(selectionItems[whichItem]);
|
14
25
|
return true;
|
15
26
|
} catch(Exception^ e) {
|
@@ -18,13 +29,13 @@ bool AutomatedComboBox::SelectByIndex(const int whichItem)
|
|
18
29
|
}
|
19
30
|
}
|
20
31
|
|
21
|
-
bool
|
32
|
+
bool AutomatedSelectList::SelectByValue(const char* whichItem)
|
22
33
|
{
|
23
34
|
try {
|
24
35
|
auto nameCondition = gcnew PropertyCondition(AutomationElement::NameProperty, gcnew String(whichItem));
|
25
36
|
auto selectionAndNameCondition = gcnew AndCondition(SelectionCondition, nameCondition);
|
26
37
|
|
27
|
-
Select(
|
38
|
+
Select(_control->FindFirst(System::Windows::Automation::TreeScope::Subtree, selectionAndNameCondition));
|
28
39
|
return true;
|
29
40
|
} catch(Exception^ e) {
|
30
41
|
Console::WriteLine(e->ToString());
|
@@ -32,7 +43,7 @@ bool AutomatedComboBox::SelectByValue(const char* whichItem)
|
|
32
43
|
}
|
33
44
|
}
|
34
45
|
|
35
|
-
bool
|
46
|
+
bool AutomatedSelectList::GetValueByIndex(const int whichItem, char* comboValue, const int comboValueSize)
|
36
47
|
{
|
37
48
|
try {
|
38
49
|
auto selectionItem = SelectionItems[whichItem];
|
@@ -46,7 +57,7 @@ bool AutomatedComboBox::GetValueByIndex(const int whichItem, char* comboValue, c
|
|
46
57
|
}
|
47
58
|
}
|
48
59
|
|
49
|
-
int
|
60
|
+
int AutomatedSelectList::SelectedIndex::get() {
|
50
61
|
int selectedIndex = 0;
|
51
62
|
for each(AutomationElement^ selectionItem in SelectionItems) {
|
52
63
|
auto selectionPattern = dynamic_cast<SelectionItemPattern^>(selectionItem->GetCurrentPattern(SelectionItemPattern::Pattern));
|
@@ -59,7 +70,7 @@ int AutomatedComboBox::SelectedIndex::get() {
|
|
59
70
|
}
|
60
71
|
|
61
72
|
|
62
|
-
void
|
73
|
+
void AutomatedSelectList::Select(AutomationElement^ itemToSelect)
|
63
74
|
{
|
64
75
|
auto selectionPattern = dynamic_cast<SelectionItemPattern^>(itemToSelect->GetCurrentPattern(SelectionItemPattern::Pattern));
|
65
76
|
selectionPattern->Select();
|
@@ -1,14 +1,22 @@
|
|
1
1
|
#pragma once
|
2
|
+
#include "AutomationControl.h"
|
3
|
+
#include "StringHelper.h"
|
4
|
+
|
2
5
|
using namespace System::Windows::Automation;
|
3
6
|
|
4
|
-
|
7
|
+
ref class AutomatedSelectList : public AutomationControl
|
5
8
|
{
|
6
9
|
public:
|
7
|
-
|
10
|
+
AutomatedSelectList(const HWND windowHandle);
|
11
|
+
AutomatedSelectList(const FindInformation& findInformation);
|
8
12
|
bool SelectByIndex(const int whichItem);
|
9
13
|
bool SelectByValue(const char* whichItem);
|
10
14
|
bool GetValueByIndex(const int whichItem, char* comboValue, const int comboValueSize);
|
11
15
|
|
16
|
+
property array<String^>^ Selection {
|
17
|
+
array<String^>^ get();
|
18
|
+
}
|
19
|
+
|
12
20
|
property int Count {
|
13
21
|
int get() { return SelectionItems->Count; }
|
14
22
|
}
|
@@ -18,11 +26,16 @@ public:
|
|
18
26
|
}
|
19
27
|
|
20
28
|
private:
|
21
|
-
AutomationElement^ _comboControl;
|
22
29
|
void Select(AutomationElement^ itemToSelect);
|
23
30
|
|
31
|
+
property SelectionPattern^ AsSelectionPattern {
|
32
|
+
SelectionPattern^ get() {
|
33
|
+
return dynamic_cast<SelectionPattern^>(_control->GetCurrentPattern(SelectionPattern::Pattern));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
24
37
|
property AutomationElementCollection^ SelectionItems {
|
25
|
-
AutomationElementCollection^ get() { return
|
38
|
+
AutomationElementCollection^ get() { return _control->FindAll(System::Windows::Automation::TreeScope::Subtree, SelectionCondition); }
|
26
39
|
}
|
27
40
|
|
28
41
|
property PropertyCondition^ SelectionCondition {
|
@@ -1,20 +1,42 @@
|
|
1
1
|
#include "StdAfx.h"
|
2
2
|
#include "AutomatedTable.h"
|
3
3
|
|
4
|
-
AutomatedTable::AutomatedTable(const HWND windowHandle)
|
4
|
+
AutomatedTable::AutomatedTable(const HWND windowHandle) : AutomationControl(windowHandle)
|
5
5
|
{
|
6
|
-
|
6
|
+
_finder = gcnew AutomationFinder(_control);
|
7
7
|
}
|
8
8
|
|
9
|
-
|
9
|
+
AutomatedTable::AutomatedTable(const FindInformation& finderInformation) : AutomationControl(finderInformation)
|
10
10
|
{
|
11
|
-
|
12
|
-
|
11
|
+
_finder = gcnew AutomationFinder(_control);
|
12
|
+
}
|
13
|
+
|
14
|
+
int AutomatedTable::GetHeaders(const char* headers[])
|
15
|
+
{
|
16
|
+
auto headerItems = _finder->Find(AutomationFinder::IsHeaderItem);
|
17
|
+
|
18
|
+
if( NULL != headers ) {
|
19
|
+
StringHelper::CopyNames(headerItems, headers);
|
20
|
+
}
|
21
|
+
|
22
|
+
return headerItems->Count;
|
23
|
+
}
|
24
|
+
|
25
|
+
int AutomatedTable::GetValues(const char* values[])
|
26
|
+
{
|
27
|
+
auto tableItems = _finder->Find(gcnew OrCondition(AutomationFinder::IsTableItem, AutomationFinder::IsListItem));
|
28
|
+
|
29
|
+
if( NULL != values ) {
|
30
|
+
StringHelper::CopyNames(tableItems, values);
|
31
|
+
}
|
32
|
+
|
33
|
+
return tableItems->Count;
|
13
34
|
}
|
14
35
|
|
15
|
-
|
36
|
+
int AutomatedTable::RowCount::get()
|
16
37
|
{
|
17
|
-
|
38
|
+
auto tablePattern = dynamic_cast<TablePattern^>(_control->GetCurrentPattern(TablePattern::Pattern));
|
39
|
+
return tablePattern->Current.RowCount;
|
18
40
|
}
|
19
41
|
|
20
42
|
bool AutomatedTable::Exists(const int whichItemIndex, const int whichColumnIndex)
|
@@ -29,22 +51,42 @@ String^ AutomatedTable::ValueAt(const int whichItemIndex, const int whichItemCol
|
|
29
51
|
|
30
52
|
AutomationElement^ AutomatedTable::DataItemAt(const int whichItemIndex, const int whichItemColumn)
|
31
53
|
{
|
32
|
-
auto dataItemProperty = gcnew PropertyCondition(AutomationElement::IsTableItemPatternAvailableProperty, true);
|
33
54
|
auto indexProperty = gcnew PropertyCondition(TableItemPattern::RowProperty, whichItemIndex);
|
34
55
|
auto columnProperty = gcnew PropertyCondition(TableItemPattern::ColumnProperty, whichItemColumn);
|
35
|
-
return
|
56
|
+
return _finder->FindFirst(AutomationFinder::IsTableItem, indexProperty, columnProperty);
|
36
57
|
}
|
37
58
|
|
38
59
|
bool AutomatedTable::Exists(Condition^ condition)
|
39
60
|
{
|
40
|
-
|
41
|
-
return _tableControl->FindAll(System::Windows::Automation::TreeScope::Subtree, gcnew AndCondition(dataItemProperty, condition))->Count > 0;
|
61
|
+
return _finder->Find(AutomationFinder::IsTableItem, condition)->Count > 0;
|
42
62
|
}
|
43
63
|
|
44
64
|
void AutomatedTable::Select(const int dataItemIndex)
|
45
65
|
{
|
46
|
-
|
47
|
-
|
66
|
+
try {
|
67
|
+
Select(_finder->Find(AutomationFinder::IsDataItem)[dataItemIndex]);
|
68
|
+
} catch(IndexOutOfRangeException^ e) {
|
69
|
+
throw gcnew ArgumentException(String::Format("Table item at index {0} does not exist", dataItemIndex));
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
bool AutomatedTable::IsSelected(const int dataItemIndex) {
|
74
|
+
|
75
|
+
return AsSelectionItem(_finder->FindAt(dataItemIndex, AutomationFinder::IsSelectionItem))->Current.IsSelected;
|
76
|
+
}
|
77
|
+
|
78
|
+
void AutomatedTable::Select(const char* dataItemValue)
|
79
|
+
{
|
80
|
+
try {
|
81
|
+
auto nameCondition = gcnew PropertyCondition(AutomationElement::NameProperty, gcnew String(dataItemValue));
|
82
|
+
Select(_finder->Find(AutomationFinder::IsDataItem, nameCondition)[0]);
|
83
|
+
} catch(IndexOutOfRangeException^ e) {
|
84
|
+
throw gcnew ArgumentException(String::Format("Table item with the value \"{0}\" was not found", gcnew String(dataItemValue)));
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
void AutomatedTable::Select(AutomationElement^ dataItem)
|
89
|
+
{
|
48
90
|
auto selectionItemPattern = dynamic_cast<SelectionItemPattern^>(dataItem->GetCurrentPattern(SelectionItemPattern::Pattern));
|
49
91
|
selectionItemPattern->Select();
|
50
92
|
}
|
@@ -1,22 +1,35 @@
|
|
1
1
|
#pragma once
|
2
|
+
#include "AutomationControl.h"
|
3
|
+
#include "AutomationFinder.h"
|
4
|
+
#include "StringHelper.h"
|
5
|
+
|
2
6
|
using namespace System::Windows::Automation;
|
3
7
|
|
4
|
-
ref class AutomatedTable
|
8
|
+
ref class AutomatedTable : AutomationControl
|
5
9
|
{
|
6
10
|
public:
|
7
11
|
AutomatedTable(const HWND windowHandle);
|
8
|
-
|
12
|
+
AutomatedTable(const FindInformation& finderInformation);
|
9
13
|
bool Exists(const int whichItemIndex, const int whichColumnIndex);
|
10
14
|
String^ ValueAt(const int whichItemIndex, const int whichColumnIndex);
|
11
15
|
void Select(const int dataItemIndex);
|
16
|
+
void Select(const char* dataItemValue);
|
17
|
+
bool IsSelected(const int dataItemIndex);
|
18
|
+
int GetHeaders(const char* headers[]);
|
19
|
+
int GetValues(const char* values[]);
|
12
20
|
|
13
21
|
property int RowCount {
|
14
22
|
int get();
|
15
23
|
}
|
16
24
|
|
17
25
|
private:
|
18
|
-
|
26
|
+
AutomationFinder^ _finder;
|
19
27
|
bool Exists(Condition^ condition);
|
20
28
|
AutomationElement^ DataItemAt(const int whichItemIndex, const int whichItemRow);
|
29
|
+
void Select(AutomationElement^ dataItem);
|
30
|
+
|
31
|
+
SelectionItemPattern^ AsSelectionItem(AutomationElement^ automationElement) {
|
32
|
+
return dynamic_cast<SelectionItemPattern^>(automationElement->GetCurrentPattern(SelectionItemPattern::Pattern));
|
33
|
+
}
|
21
34
|
};
|
22
35
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "AutomationControl.h"
|
3
|
+
#include "AutomationFinder.h"
|
4
|
+
|
5
|
+
AutomationControl::AutomationControl(const HWND windowHandle)
|
6
|
+
{
|
7
|
+
_control = AutomationElement::FromHandle(IntPtr(windowHandle));
|
8
|
+
}
|
9
|
+
|
10
|
+
AutomationControl::AutomationControl(const FindInformation& findInformation)
|
11
|
+
{
|
12
|
+
try {
|
13
|
+
auto rootElement = AutomationElement::FromHandle(IntPtr(findInformation.rootWindow));
|
14
|
+
auto finder = gcnew AutomationFinder(rootElement);
|
15
|
+
_control = finder->Find(findInformation);
|
16
|
+
}
|
17
|
+
catch(Exception^ e) {
|
18
|
+
Debug::WriteLine("AutomationControl error: {0}", e->Message);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
void AutomationControl::Value::set(String^ value) {
|
23
|
+
AsValuePattern->SetValue(value);
|
24
|
+
}
|
25
|
+
|
26
|
+
String^ AutomationControl::Value::get() {
|
27
|
+
return AsValuePattern->Current.Value;
|
28
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
using namespace System::Windows::Automation;
|
4
|
+
using namespace System::Windows;
|
5
|
+
using namespace System::Diagnostics;
|
6
|
+
|
7
|
+
ref class AutomationControl
|
8
|
+
{
|
9
|
+
public:
|
10
|
+
AutomationControl(const HWND windowHandle);
|
11
|
+
AutomationControl(const FindInformation& findInformation);
|
12
|
+
|
13
|
+
property AutomationElement^ Element {
|
14
|
+
AutomationElement^ get() { return _control; }
|
15
|
+
}
|
16
|
+
|
17
|
+
property String^ Name {
|
18
|
+
String^ get() { return _control->Current.Name; }
|
19
|
+
}
|
20
|
+
|
21
|
+
property String^ ClassName {
|
22
|
+
String^ get() { return _control->Current.ClassName; }
|
23
|
+
}
|
24
|
+
|
25
|
+
property Rect BoundingRectangle {
|
26
|
+
Rect get() { return _control->Current.BoundingRectangle; }
|
27
|
+
}
|
28
|
+
|
29
|
+
property System::Windows::Automation::ControlType^ ControlType {
|
30
|
+
System::Windows::Automation::ControlType^ get() { return _control->Current.ControlType; }
|
31
|
+
}
|
32
|
+
|
33
|
+
property int ProcessId {
|
34
|
+
int get() { return _control->Current.ProcessId; }
|
35
|
+
}
|
36
|
+
|
37
|
+
property String^ Value {
|
38
|
+
String^ get();
|
39
|
+
void set(String^ value);
|
40
|
+
}
|
41
|
+
|
42
|
+
property bool Exists {
|
43
|
+
bool get() { return nullptr != _control; }
|
44
|
+
}
|
45
|
+
|
46
|
+
protected:
|
47
|
+
AutomationElement^ _control;
|
48
|
+
|
49
|
+
private:
|
50
|
+
property ValuePattern^ AsValuePattern {
|
51
|
+
ValuePattern^ get() {
|
52
|
+
return dynamic_cast<ValuePattern^>(_control->GetCurrentPattern(ValuePattern::Pattern));
|
53
|
+
}
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|