rautomation 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,57 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "AutomationFinder.h"
|
3
|
+
|
4
|
+
AutomationFinder::AutomationFinder(AutomationElement^ automationElement)
|
5
|
+
{
|
6
|
+
_automationElement = automationElement;
|
7
|
+
}
|
8
|
+
|
9
|
+
AutomationElementCollection^ AutomationFinder::Find(...array<Condition^>^ conditions)
|
10
|
+
{
|
11
|
+
return _automationElement->FindAll(System::Windows::Automation::TreeScope::Subtree, SomethingOrEverything(conditions));
|
12
|
+
}
|
13
|
+
|
14
|
+
AutomationElement^ AutomationFinder::FindFirst(...array<Condition^>^ conditions)
|
15
|
+
{
|
16
|
+
return _automationElement->FindFirst(System::Windows::Automation::TreeScope::Subtree, SomethingOrEverything(conditions));
|
17
|
+
}
|
18
|
+
|
19
|
+
AutomationElement^ AutomationFinder::Find(const FindInformation& findInformation)
|
20
|
+
{
|
21
|
+
switch(findInformation.how) {
|
22
|
+
case FindMethod::Id:
|
23
|
+
{
|
24
|
+
auto searchCondition = gcnew PropertyCondition(AutomationElement::AutomationIdProperty, gcnew String(findInformation.data.stringData));
|
25
|
+
return FindAt(findInformation.index, searchCondition);
|
26
|
+
}
|
27
|
+
case FindMethod::Value:
|
28
|
+
{
|
29
|
+
auto searchCondition = gcnew PropertyCondition(AutomationElement::NameProperty, gcnew String(findInformation.data.stringData));
|
30
|
+
return FindAt(findInformation.index, searchCondition);
|
31
|
+
}
|
32
|
+
case FindMethod::Focus:
|
33
|
+
return AutomationElement::FocusedElement;
|
34
|
+
case FindMethod::ScreenPoint:
|
35
|
+
return AutomationElement::FromPoint(Point(findInformation.data.pointData[0], findInformation.data.pointData[1]));
|
36
|
+
case FindMethod::Handle:
|
37
|
+
return AutomationElement::FromHandle(IntPtr(findInformation.data.intData));
|
38
|
+
}
|
39
|
+
|
40
|
+
return nullptr;
|
41
|
+
}
|
42
|
+
|
43
|
+
AutomationElement^ AutomationFinder::FindAt(const int whichItem, ...array<Condition^>^ conditions)
|
44
|
+
{
|
45
|
+
return Find(conditions)[whichItem];
|
46
|
+
}
|
47
|
+
|
48
|
+
Condition^ AutomationFinder::SomethingOrEverything(...array<Condition^>^ conditions)
|
49
|
+
{
|
50
|
+
if( conditions->Length == 0 ) {
|
51
|
+
return Condition::TrueCondition;
|
52
|
+
} else if( conditions->Length == 1 ) {
|
53
|
+
return conditions[0];
|
54
|
+
}
|
55
|
+
|
56
|
+
return gcnew AndCondition(conditions);
|
57
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#pragma once
|
2
|
+
using namespace System::Windows;
|
3
|
+
using namespace System::Windows::Automation;
|
4
|
+
|
5
|
+
ref class AutomationFinder
|
6
|
+
{
|
7
|
+
public:
|
8
|
+
AutomationFinder(AutomationElement^ automationElement);
|
9
|
+
AutomationElementCollection^ Find(...array<Condition^>^ conditions);
|
10
|
+
AutomationElement^ Find(const FindInformation& findInformation);
|
11
|
+
AutomationElement^ FindFirst(...array<Condition^>^ conditions);
|
12
|
+
AutomationElement^ FindAt(const int whichItem, ...array<Condition^>^ conditions);
|
13
|
+
|
14
|
+
static property Condition^ IsSelectionItem {
|
15
|
+
Condition^ get() {
|
16
|
+
return gcnew PropertyCondition(AutomationElement::IsSelectionItemPatternAvailableProperty, true);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
static property Condition^ IsTableItem {
|
21
|
+
Condition^ get() {
|
22
|
+
return gcnew PropertyCondition(AutomationElement::IsTableItemPatternAvailableProperty, true);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
static property Condition^ IsDataItem {
|
27
|
+
Condition^ get() {
|
28
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::DataItem);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
static property Condition^ IsHeaderItem {
|
33
|
+
Condition^ get() {
|
34
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::HeaderItem);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
static property Condition^ IsListItem {
|
39
|
+
Condition^ get() {
|
40
|
+
return gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::ListItem);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
private:
|
45
|
+
AutomationElement^ _automationElement;
|
46
|
+
Condition^ SomethingOrEverything(...array<Condition^>^ conditions);
|
47
|
+
};
|
48
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
#include "AutomationControl.h"
|
3
|
+
#include "StringHelper.h"
|
4
|
+
|
5
|
+
extern "C" {
|
6
|
+
__declspec ( dllexport ) void Control_GetValue(const HWND windowHandle, char* theValue, const int maximumLength) {
|
7
|
+
auto control = gcnew AutomationControl(windowHandle);
|
8
|
+
StringHelper::CopyToUnmanagedString(control->Value, theValue, maximumLength);
|
9
|
+
}
|
10
|
+
|
11
|
+
__declspec ( dllexport ) void Control_SetValue(const HWND windowHandle, const char* theValue) {
|
12
|
+
auto control = gcnew AutomationControl(windowHandle);
|
13
|
+
control->Value = gcnew String(theValue);
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,58 @@
|
|
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
|
+
__declspec ( dllexport ) void Menu_SelectPath(const HWND windowHandle, char* errorInfo, const int errorInfoSize, const char* arg0, ...) {
|
10
|
+
va_list arguments;
|
11
|
+
va_start(arguments, arg0);
|
12
|
+
|
13
|
+
std::list<const char*> menuItems;
|
14
|
+
|
15
|
+
const char* lastArgument = arg0;
|
16
|
+
while( NULL != lastArgument ) {
|
17
|
+
menuItems.push_back(lastArgument);
|
18
|
+
lastArgument = va_arg(arguments, const char*);
|
19
|
+
}
|
20
|
+
va_end(arguments);
|
21
|
+
|
22
|
+
MenuSelectPath(windowHandle, errorInfo, errorInfoSize, menuItems);
|
23
|
+
}
|
24
|
+
|
25
|
+
__declspec ( dllexport ) BOOL Menu_ItemExists(const HWND windowHandle, const char* arg0, ...) {
|
26
|
+
va_list arguments;
|
27
|
+
va_start(arguments, arg0);
|
28
|
+
|
29
|
+
std::list<const char*> menuItems;
|
30
|
+
|
31
|
+
const char* lastArgument = arg0;
|
32
|
+
while( NULL != lastArgument ) {
|
33
|
+
menuItems.push_back(lastArgument);
|
34
|
+
lastArgument = va_arg(arguments, const char*);
|
35
|
+
}
|
36
|
+
va_end(arguments);
|
37
|
+
|
38
|
+
return MenuItemExists(windowHandle, menuItems);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems)
|
43
|
+
{
|
44
|
+
auto menuSelector = gcnew MenuItemSelector();
|
45
|
+
return menuSelector->MenuItemExists(windowHandle, menuItems);
|
46
|
+
}
|
47
|
+
|
48
|
+
void MenuSelectPath(const HWND windowHandle, char* errorInfo, const int errorInfoSize, std::list<const char*>& menuItems)
|
49
|
+
{
|
50
|
+
try {
|
51
|
+
auto menuSelector = gcnew MenuItemSelector();
|
52
|
+
menuSelector->SelectMenuPath(windowHandle, menuItems);
|
53
|
+
} catch(Exception^ e) {
|
54
|
+
if( errorInfo ) {
|
55
|
+
StringHelper::CopyToUnmanagedString(e->ToString(), errorInfo, errorInfoSize);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
#include "AutomatedSelectList.h"
|
3
|
+
|
4
|
+
extern "C" {
|
5
|
+
|
6
|
+
__declspec ( dllexport ) int SelectList_Count(const FindInformation& findInformation) {
|
7
|
+
auto autoSelectList = gcnew AutomatedSelectList(findInformation);
|
8
|
+
return autoSelectList->Count;
|
9
|
+
}
|
10
|
+
|
11
|
+
__declspec ( dllexport ) int SelectList_SelectedIndex(const HWND windowHandle) {
|
12
|
+
auto autoSelectList = gcnew AutomatedSelectList(windowHandle);
|
13
|
+
return autoSelectList->SelectedIndex;
|
14
|
+
}
|
15
|
+
|
16
|
+
__declspec ( dllexport ) void SelectList_Selection(const FindInformation& findInformation, char* selection, const int selectionLength) {
|
17
|
+
auto selectList = gcnew AutomatedSelectList(findInformation);
|
18
|
+
auto currentSelections = selectList->Selection;
|
19
|
+
auto firstSelection = currentSelections.Length == 0 ? "" : currentSelections[0];
|
20
|
+
StringHelper::CopyToUnmanagedString(firstSelection, selection, selectionLength);
|
21
|
+
}
|
22
|
+
|
23
|
+
__declspec ( dllexport ) bool SelectList_ValueAt(const HWND windowHandle, const int whichItem, char* comboValue, const int comboValueSize) {
|
24
|
+
auto autoSelectList = gcnew AutomatedSelectList(windowHandle);
|
25
|
+
return autoSelectList->GetValueByIndex(whichItem, comboValue, comboValueSize);
|
26
|
+
}
|
27
|
+
|
28
|
+
__declspec ( dllexport ) bool SelectList_SelectIndex(const FindInformation& findInformation, const int whichItem) {
|
29
|
+
auto autoSelectList = gcnew AutomatedSelectList(findInformation);
|
30
|
+
return autoSelectList->SelectByIndex(whichItem);
|
31
|
+
}
|
32
|
+
|
33
|
+
__declspec ( dllexport ) int SelectList_SelectValue(const FindInformation& findInformation, char *pValue) {
|
34
|
+
auto autoSelectList = gcnew AutomatedSelectList(findInformation);
|
35
|
+
return autoSelectList->SelectByValue(pValue);
|
36
|
+
}
|
37
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#include "StdAfx.h"
|
2
|
+
#include "SelectionItem.h"
|
3
|
+
|
4
|
+
SelectionItem::SelectionItem(const HWND windowHandle) : AutomationControl(windowHandle)
|
5
|
+
{
|
6
|
+
}
|
7
|
+
|
8
|
+
SelectionItem::SelectionItem(const FindInformation& findInformation) : AutomationControl(findInformation)
|
9
|
+
{
|
10
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#pragma once
|
2
|
+
#include "automationcontrol.h"
|
3
|
+
ref class SelectionItem :
|
4
|
+
public AutomationControl
|
5
|
+
{
|
6
|
+
public:
|
7
|
+
SelectionItem(const HWND windowHandle);
|
8
|
+
SelectionItem(const FindInformation& findInformation);
|
9
|
+
|
10
|
+
property bool IsSelected {
|
11
|
+
bool get() { return AsSelectionItemPattern->Current.IsSelected; }
|
12
|
+
}
|
13
|
+
|
14
|
+
private:
|
15
|
+
property SelectionItemPattern^ AsSelectionItemPattern {
|
16
|
+
SelectionItemPattern^ get() {
|
17
|
+
return dynamic_cast<SelectionItemPattern^>(_control->GetCurrentPattern(SelectionItemPattern::Pattern));
|
18
|
+
}
|
19
|
+
}
|
20
|
+
};
|
21
|
+
|
@@ -4,6 +4,37 @@
|
|
4
4
|
void StringHelper::CopyToUnmanagedString(String^ source, char* destination, const int destinationSize)
|
5
5
|
{
|
6
6
|
auto unmanagedString = Marshal::StringToHGlobalAnsi(source);
|
7
|
-
strncpy(destination, (const char*)(void*)unmanagedString, destinationSize
|
8
|
-
Marshal::FreeHGlobal(unmanagedString);
|
7
|
+
strncpy(destination, (const char*)(void*)unmanagedString, destinationSize);
|
8
|
+
Marshal::FreeHGlobal(unmanagedString);
|
9
9
|
}
|
10
|
+
|
11
|
+
char* StringHelper::UnmanagedStringFrom(String^ source)
|
12
|
+
{
|
13
|
+
const int numberOfBytes = source->Length + 1;
|
14
|
+
auto unmanagedString = new char[numberOfBytes];
|
15
|
+
CopyToUnmanagedString(source, unmanagedString, numberOfBytes);
|
16
|
+
return unmanagedString;
|
17
|
+
}
|
18
|
+
|
19
|
+
void StringHelper::FreeUp(const char* unmanagedStrings[], const int numberOfStrings)
|
20
|
+
{
|
21
|
+
for(auto whichString = 0; whichString < numberOfStrings; ++whichString) {
|
22
|
+
delete[] unmanagedStrings[whichString];
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
void StringHelper::CopyNames(AutomationElementCollection^ automationElements, const char* unmanagedStrings[])
|
27
|
+
{
|
28
|
+
auto whichItem = 0;
|
29
|
+
for each(AutomationElement^ automationElement in automationElements) {
|
30
|
+
unmanagedStrings[whichItem++] = UnmanagedStringFrom(automationElement->Current.Name);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
void StringHelper::CopyClassNames(AutomationElementCollection^ automationElements, const char* unmanagedStrings[])
|
35
|
+
{
|
36
|
+
auto whichItem = 0;
|
37
|
+
for each(AutomationElement^ automationElement in automationElements) {
|
38
|
+
unmanagedStrings[whichItem++] = UnmanagedStringFrom(automationElement->Current.ClassName);
|
39
|
+
}
|
40
|
+
}
|
@@ -1,7 +1,13 @@
|
|
1
1
|
#pragma once
|
2
|
+
using namespace System::Windows::Automation;
|
3
|
+
|
2
4
|
ref class StringHelper
|
3
5
|
{
|
4
6
|
public:
|
5
7
|
static void CopyToUnmanagedString(String^ source, char* destination, const int destinationSize);
|
8
|
+
static char* UnmanagedStringFrom(String^ source);
|
9
|
+
static void FreeUp(const char* unmanagedStrings[], const int numberOfStrings);
|
10
|
+
static void CopyNames(AutomationElementCollection^ automationElements, const char* unmanagedStrings[]);
|
11
|
+
static void CopyClassNames(AutomationElementCollection^ automationElements, const char* unmanagedStrings[]);
|
6
12
|
};
|
7
13
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#include "stdafx.h"
|
2
|
+
#include "AutomatedTable.h"
|
3
|
+
|
4
|
+
extern "C" {
|
5
|
+
|
6
|
+
__declspec ( dllexport ) int Table_GetHeaders(const HWND windowHandle, const char* headers[]) {
|
7
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
8
|
+
return tableControl->GetHeaders(headers);
|
9
|
+
}
|
10
|
+
|
11
|
+
__declspec ( dllexport ) int Table_GetValues(const HWND windowHandle, const char* values[]) {
|
12
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
13
|
+
return tableControl->GetValues(values);
|
14
|
+
}
|
15
|
+
|
16
|
+
__declspec ( dllexport ) int Table_FindValues(const FindInformation& findInformation, const char* values[]) {
|
17
|
+
auto tableControl = gcnew AutomatedTable(findInformation);
|
18
|
+
return tableControl->GetValues(values);
|
19
|
+
}
|
20
|
+
|
21
|
+
__declspec ( dllexport ) int Table_RowCount(const HWND windowHandle) {
|
22
|
+
try {
|
23
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
24
|
+
return tableControl->RowCount;
|
25
|
+
} catch(Exception^ e) {
|
26
|
+
Console::WriteLine(e->ToString());
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
__declspec ( dllexport ) bool Table_CoordinateIsValid(const HWND windowHandle, const int whichItemIndex, const int whichColumnIndex) {
|
31
|
+
try {
|
32
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
33
|
+
return tableControl->Exists(whichItemIndex, whichColumnIndex);
|
34
|
+
} catch(Exception^ e) {
|
35
|
+
Console::WriteLine(e->ToString());
|
36
|
+
return false;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
__declspec ( dllexport ) void Table_ValueAt(const HWND windowHandle, const int row, const int column, char *foundValue, const int foundValueLength) {
|
41
|
+
try {
|
42
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
43
|
+
auto rowValue = tableControl->ValueAt(row, column);
|
44
|
+
StringHelper::CopyToUnmanagedString(rowValue, foundValue, foundValueLength);
|
45
|
+
} catch(Exception^ e) {
|
46
|
+
Console::WriteLine(e->ToString());
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
__declspec ( dllexport ) void Table_SelectByIndex(const HWND windowHandle, const int dataItemIndex) {
|
51
|
+
try {
|
52
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
53
|
+
tableControl->Select(dataItemIndex);
|
54
|
+
} catch(Exception^ e) {
|
55
|
+
Console::WriteLine(e->ToString());
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
__declspec ( dllexport ) bool Table_IsSelectedByIndex(const HWND windowHandle, const int dataItemIndex) {
|
60
|
+
try {
|
61
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
62
|
+
return tableControl->IsSelected(dataItemIndex);
|
63
|
+
} catch(Exception^ e) {
|
64
|
+
Console::WriteLine(e->ToString());
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
__declspec ( dllexport ) void Table_SelectByValue(const HWND windowHandle, const char* dataItemValue) {
|
69
|
+
try {
|
70
|
+
auto tableControl = gcnew AutomatedTable(windowHandle);
|
71
|
+
tableControl->Select(dataItemValue);
|
72
|
+
} catch(Exception^ e) {
|
73
|
+
Console::WriteLine(e->ToString());
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#pragma once
|
2
|
+
#include "AutomationControl.h"
|
3
|
+
|
4
|
+
ref class Toggle : public AutomationControl
|
5
|
+
{
|
6
|
+
public:
|
7
|
+
Toggle(const HWND windowHandle) : AutomationControl(windowHandle) {}
|
8
|
+
Toggle(const FindInformation& findInformation) : AutomationControl(findInformation) {}
|
9
|
+
|
10
|
+
property bool IsSet {
|
11
|
+
bool get() { return AsTogglePattern->Current.ToggleState == System::Windows::Automation::ToggleState::On; }
|
12
|
+
}
|
13
|
+
|
14
|
+
private:
|
15
|
+
property TogglePattern^ AsTogglePattern {
|
16
|
+
TogglePattern^ get() {
|
17
|
+
return dynamic_cast<TogglePattern^>(_control->GetCurrentPattern(TogglePattern::Pattern));
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
};
|
22
|
+
|
@@ -2,77 +2,90 @@
|
|
2
2
|
//
|
3
3
|
|
4
4
|
#include "stdafx.h"
|
5
|
-
#include "AutomatedComboBox.h"
|
6
|
-
#include "AutomatedTable.h"
|
7
5
|
#include "AutomationClicker.h"
|
6
|
+
#include "AutomationControl.h"
|
7
|
+
#include "AutomationFinder.h"
|
8
8
|
#include "ExpandCollapseHelper.h"
|
9
|
-
#include "
|
10
|
-
#include "
|
9
|
+
#include "StringHelper.h"
|
10
|
+
#include "SelectionItem.h"
|
11
|
+
#include "Toggle.h"
|
11
12
|
|
12
13
|
IUIAutomation* getGlobalIUIAutomation() ;
|
13
14
|
|
14
|
-
|
15
|
-
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems);
|
16
|
-
void SelectMenuItem(const HWND windowHandle, char* errorInfo, const int errorInfoSize, std::list<const char*>& menuItems);
|
17
|
-
int McppHowManyDataItemsFor(const HWND windowHandle);
|
18
|
-
|
19
15
|
extern "C" {
|
20
|
-
__declspec( dllexport ) IUIAutomationElement *RA_FindWindow(char *pszAutomationId) {
|
21
|
-
IUIAutomationElement *pRootElement ;
|
22
|
-
|
23
|
-
HRESULT hr = getGlobalIUIAutomation()->GetRootElement(&pRootElement) ;
|
24
|
-
if (SUCCEEDED(hr)) {
|
25
|
-
IUIAutomationCondition *pCondition ;
|
26
|
-
VARIANT varProperty ;
|
27
|
-
|
28
|
-
VariantInit(&varProperty) ;
|
29
|
-
varProperty.vt = VT_BSTR ;
|
30
|
-
varProperty.bstrVal = _bstr_t(pszAutomationId) ;
|
31
16
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
17
|
+
__declspec ( dllexport ) bool ElementExists(const FindInformation& findInformation) {
|
18
|
+
auto automationElement = gcnew AutomationControl(findInformation);
|
19
|
+
return automationElement->Exists;
|
20
|
+
}
|
21
|
+
|
22
|
+
__declspec ( dllexport ) int BoundingRectangle(const FindInformation& findInformation, long *rectangle) {
|
23
|
+
try {
|
24
|
+
auto automationElement = gcnew AutomationControl(findInformation);
|
25
|
+
auto boundary = automationElement->BoundingRectangle;
|
26
|
+
|
27
|
+
rectangle[0] = boundary.Left;
|
28
|
+
rectangle[1] = boundary.Top;
|
29
|
+
rectangle[2] = boundary.Right;
|
30
|
+
rectangle[3] = boundary.Bottom;
|
31
|
+
return 1;
|
32
|
+
}
|
33
|
+
catch(Exception^ e) {
|
34
|
+
Console::WriteLine("BoundingRectangle: {0}", e->Message);
|
35
|
+
return 0;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
__declspec ( dllexport ) int ControlType(const FindInformation& findInformation) {
|
40
|
+
try {
|
41
|
+
auto automationElement = gcnew AutomationControl(findInformation);
|
42
|
+
return automationElement->ControlType->Id;
|
43
|
+
} catch(Exception^ e) {
|
44
|
+
Console::WriteLine("ControlType: {0}", e->Message);
|
45
|
+
return 0;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
__declspec ( dllexport ) int ProcessId(const FindInformation& findInformation) {
|
50
|
+
try {
|
51
|
+
auto automationElement = gcnew AutomationControl(findInformation);
|
52
|
+
return automationElement->ProcessId;
|
53
|
+
} catch(Exception^ e) {
|
54
|
+
Console::WriteLine("ProcessId: {0}", e->Message);
|
55
|
+
return 0;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
__declspec ( dllexport ) void Name(const FindInformation& findInformation, char* name, const int nameLength) {
|
60
|
+
try {
|
61
|
+
auto control = gcnew AutomationControl(findInformation);
|
62
|
+
StringHelper::CopyToUnmanagedString(control->Name, name, nameLength);
|
63
|
+
} catch(Exception^ e) {
|
64
|
+
Console::WriteLine("Name: {0}", e->Message);
|
41
65
|
}
|
42
|
-
|
43
|
-
}
|
66
|
+
}
|
44
67
|
|
45
|
-
|
46
|
-
|
47
|
-
|
68
|
+
__declspec ( dllexport ) void ClassName(const FindInformation& findInformation, char* className, const int classNameLength) {
|
69
|
+
try {
|
70
|
+
auto control = gcnew AutomationControl(findInformation);
|
71
|
+
StringHelper::CopyToUnmanagedString(control->ClassName, className, classNameLength);
|
72
|
+
} catch(Exception^ e) {
|
73
|
+
Console::WriteLine("ClassName: {0}", e->Message);
|
74
|
+
}
|
75
|
+
}
|
48
76
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
VARIANT varProperty;
|
77
|
+
__declspec ( dllexport ) int GetClassNames(const FindInformation& findInformation, const char* classNames[]) {
|
78
|
+
auto control = gcnew AutomationControl(findInformation);
|
79
|
+
auto finder = gcnew AutomationFinder(control->Element);
|
53
80
|
|
54
|
-
|
55
|
-
varProperty.vt = VT_I4;
|
56
|
-
varProperty.intVal = (processId);
|
81
|
+
auto allChildren = finder->Find();
|
57
82
|
|
58
|
-
|
59
|
-
|
83
|
+
if( NULL != classNames ) {
|
84
|
+
StringHelper::CopyClassNames(allChildren, classNames);
|
85
|
+
}
|
60
86
|
|
61
|
-
|
62
|
-
|
63
|
-
return 1;
|
64
|
-
}
|
65
|
-
}
|
66
|
-
}
|
67
|
-
return 0;
|
68
|
-
}
|
69
|
-
|
70
|
-
__declspec( dllexport ) BOOL RA_IsOffscreen(IUIAutomationElement *pElement) {
|
71
|
-
BOOL isOffscreen ;
|
72
|
-
pElement->get_CurrentIsOffscreen(&isOffscreen) ;
|
73
|
-
|
74
|
-
return isOffscreen ;
|
75
|
-
}
|
87
|
+
return allChildren->Count;
|
88
|
+
}
|
76
89
|
|
77
90
|
__declspec ( dllexport ) IUIAutomationElement *RA_ElementFromHandle(HWND hwnd) {
|
78
91
|
IUIAutomationElement *pElement ;
|
@@ -86,19 +99,6 @@ extern "C" {
|
|
86
99
|
}
|
87
100
|
}
|
88
101
|
|
89
|
-
__declspec ( dllexport ) IUIAutomationElement *RA_GetFocusedElement() {
|
90
|
-
IUIAutomationElement *pelement;
|
91
|
-
|
92
|
-
HRESULT hr = getGlobalIUIAutomation()->GetFocusedElement(&pelement);
|
93
|
-
|
94
|
-
if (SUCCEEDED(hr))
|
95
|
-
return pelement;
|
96
|
-
else {
|
97
|
-
printf("RA_GetFocusedElement: Cannot find element from focus. HRESULT was 0x%x\r\n", hr) ;
|
98
|
-
return false ;
|
99
|
-
}
|
100
|
-
}
|
101
|
-
|
102
102
|
__declspec ( dllexport ) IUIAutomationElement *RA_ElementFromPoint(int xCoord, int yCoord) {
|
103
103
|
IUIAutomationElement *pElement ;
|
104
104
|
POINT point;
|
@@ -143,34 +143,6 @@ extern "C" {
|
|
143
143
|
}
|
144
144
|
}
|
145
145
|
|
146
|
-
__declspec ( dllexport ) IUIAutomationElement *RA_FindChildByName(IUIAutomationElement *pElement, char *elementName) {
|
147
|
-
IUIAutomationCondition *pCondition ;
|
148
|
-
VARIANT varProperty ;
|
149
|
-
|
150
|
-
VariantInit(&varProperty) ;
|
151
|
-
varProperty.vt = VT_BSTR ;
|
152
|
-
varProperty.bstrVal = _bstr_t(elementName) ;
|
153
|
-
|
154
|
-
HRESULT hr = getGlobalIUIAutomation()->CreatePropertyCondition(UIA_NamePropertyId, varProperty, &pCondition) ;
|
155
|
-
if (SUCCEEDED(hr)) {
|
156
|
-
IUIAutomationElement *pFound ;
|
157
|
-
|
158
|
-
hr = pElement->FindFirst(TreeScope_Descendants, pCondition, &pFound) ;
|
159
|
-
if (SUCCEEDED(hr)) {
|
160
|
-
if (pFound == NULL)
|
161
|
-
printf("RA_FindChildByName: Element with automation name %s was not found\r\n", elementName) ;
|
162
|
-
//printf("RA_FindChildByName: success with value %s\r\n", elementName) ;
|
163
|
-
return pFound ;
|
164
|
-
} else {
|
165
|
-
printf("RA_FindChildByName: FindFirst for children looking for %s failed. hr = 0x%x\r\n", elementName, hr) ;
|
166
|
-
return NULL ;
|
167
|
-
}
|
168
|
-
} else {
|
169
|
-
printf("RA_FindChildByName: Cannot create search condition. hr = 0x%x\r\n", hr) ;
|
170
|
-
return NULL ;
|
171
|
-
}
|
172
|
-
}
|
173
|
-
|
174
146
|
__declspec ( dllexport ) HWND RA_CurrentNativeWindowHandle(IUIAutomationElement *pElement) {
|
175
147
|
UIA_HWND uia_hwnd ;
|
176
148
|
|
@@ -183,21 +155,6 @@ extern "C" {
|
|
183
155
|
return (HWND)uia_hwnd ;
|
184
156
|
}
|
185
157
|
|
186
|
-
__declspec ( dllexport ) int RA_GetCurrentProcessId(IUIAutomationElement *pElement) {
|
187
|
-
HRESULT hr;
|
188
|
-
int process_id;
|
189
|
-
|
190
|
-
hr = pElement->get_CurrentProcessId(&process_id);
|
191
|
-
|
192
|
-
if (SUCCEEDED(hr)){
|
193
|
-
return process_id;
|
194
|
-
}
|
195
|
-
else {
|
196
|
-
printf("RA_GetCurrentProcessId: get_CurrentProcessId returned 0x%x\r\n", hr) ;
|
197
|
-
return 0 ;
|
198
|
-
}
|
199
|
-
}
|
200
|
-
|
201
158
|
__declspec ( dllexport ) BOOL RA_SetFocus(IUIAutomationElement *pElement) {
|
202
159
|
HRESULT hr = pElement->SetFocus() ;
|
203
160
|
if (hr != S_OK)
|
@@ -228,29 +185,6 @@ extern "C" {
|
|
228
185
|
return SetCursorPos(x,y);
|
229
186
|
}
|
230
187
|
|
231
|
-
__declspec ( dllexport ) long RA_GetDesktopHandle() {
|
232
|
-
return (long)GetDesktopWindow();
|
233
|
-
}
|
234
|
-
|
235
|
-
__declspec ( dllexport ) int RA_CurrentBoundingRectangle(IUIAutomationElement *pElement, long *rectangle) {
|
236
|
-
RECT boundary;
|
237
|
-
|
238
|
-
HRESULT hr = pElement->get_CurrentBoundingRectangle(&boundary) ;
|
239
|
-
if (SUCCEEDED(hr)) {
|
240
|
-
|
241
|
-
rectangle[0] = boundary.left;
|
242
|
-
rectangle[1] = boundary.top;
|
243
|
-
rectangle[2] = boundary.right;
|
244
|
-
rectangle[3] = boundary.bottom;
|
245
|
-
|
246
|
-
return 1;
|
247
|
-
}
|
248
|
-
else {
|
249
|
-
printf("RA_CurrentBoundingRectangle: get_CurrentBoundingRectangle failed 0x%x\r\n", hr) ;
|
250
|
-
return 0 ;
|
251
|
-
}
|
252
|
-
}
|
253
|
-
|
254
188
|
__declspec ( dllexport ) int RA_CurrentIsOffscreen(IUIAutomationElement *pElement, int *visible) {
|
255
189
|
BOOL offscreen;
|
256
190
|
|
@@ -311,74 +245,35 @@ extern "C" {
|
|
311
245
|
return element_count ;
|
312
246
|
}
|
313
247
|
|
314
|
-
__declspec ( dllexport )
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
return
|
321
|
-
}
|
322
|
-
|
323
|
-
char *pszName = _com_util::ConvertBSTRToString(bstrName) ;
|
324
|
-
|
325
|
-
if (pszName != NULL){
|
326
|
-
if (pName == NULL) {
|
327
|
-
return strlen(pszName) ;
|
328
|
-
} else {
|
329
|
-
strcpy(pName, pszName) ;
|
330
|
-
return strlen(pszName) ;
|
331
|
-
}
|
332
|
-
} else {
|
333
|
-
return -1;
|
334
|
-
}
|
335
|
-
}
|
336
|
-
|
337
|
-
__declspec ( dllexport ) int RA_GetClassName(IUIAutomationElement *pElement, char *pClass) {
|
338
|
-
BSTR bstrClass ;
|
339
|
-
HRESULT hr = pElement->get_CurrentClassName(&bstrClass) ;
|
340
|
-
|
341
|
-
if (FAILED(hr)) {
|
342
|
-
printf("RA_GetName: get_CurrentClassName failed 0x%x\r\n", hr) ;
|
343
|
-
return -1 ;
|
344
|
-
}
|
345
|
-
|
346
|
-
char *pszClass = _com_util::ConvertBSTRToString(bstrClass) ;
|
347
|
-
|
348
|
-
if (pszClass != NULL){
|
349
|
-
if (pClass == NULL) {
|
350
|
-
return strlen(pszClass) ;
|
351
|
-
} else {
|
352
|
-
strcpy(pClass, pszClass) ;
|
353
|
-
return strlen(pszClass) ;
|
354
|
-
}
|
355
|
-
} else {
|
356
|
-
return -1;
|
248
|
+
__declspec ( dllexport ) bool RA_GetControlName(const HWND windowHandle, char* windowName, const int windowNameLength) {
|
249
|
+
try {
|
250
|
+
auto control = gcnew AutomationControl(windowHandle);
|
251
|
+
StringHelper::CopyToUnmanagedString(control->Name, windowName, windowNameLength);
|
252
|
+
return true;
|
253
|
+
} catch(Exception^ e) {
|
254
|
+
return false;
|
357
255
|
}
|
358
256
|
}
|
359
257
|
|
360
|
-
|
361
|
-
|
362
|
-
|
258
|
+
__declspec ( dllexport ) bool IsSet(const FindInformation& findInformation) {
|
259
|
+
try {
|
260
|
+
auto toggle = gcnew Toggle(findInformation);
|
261
|
+
return toggle->IsSet;
|
262
|
+
} catch(Exception^ e) {
|
263
|
+
Debug::WriteLine("IsSet: {0}", e->Message);
|
264
|
+
return false;
|
265
|
+
}
|
266
|
+
}
|
363
267
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
BOOL RetVal ;
|
374
|
-
hr = pSelectionPattern->get_IsSelected(&RetVal) ;
|
375
|
-
if (FAILED(hr)) {
|
376
|
-
printf("RA_GetIsSelected: get_IsSelected failed 0x%x\r\n", hr) ;
|
377
|
-
return FALSE ;
|
378
|
-
} else {
|
379
|
-
return RetVal ;
|
380
|
-
}
|
381
|
-
}
|
268
|
+
__declspec ( dllexport ) bool IsSelected(const FindInformation& findInformation) {
|
269
|
+
try {
|
270
|
+
auto selectionItem = gcnew SelectionItem(findInformation);
|
271
|
+
return selectionItem->IsSelected;
|
272
|
+
} catch(Exception^ e) {
|
273
|
+
Debug::WriteLine("IsSelected: {0}", e->Message);
|
274
|
+
return false;
|
275
|
+
}
|
276
|
+
}
|
382
277
|
|
383
278
|
__declspec ( dllexport ) int RA_Select(IUIAutomationElement *pElement) {
|
384
279
|
ISelectionItemProvider *pSelectionPattern ;
|
@@ -419,114 +314,6 @@ extern "C" {
|
|
419
314
|
}
|
420
315
|
}
|
421
316
|
|
422
|
-
__declspec ( dllexport ) int RA_GetComboOptionsCount(const HWND windowHandle) {
|
423
|
-
auto autoComboBox = gcnew AutomatedComboBox(windowHandle);
|
424
|
-
return autoComboBox->Count;
|
425
|
-
}
|
426
|
-
|
427
|
-
__declspec ( dllexport ) int RA_GetSelectedComboIndex(const HWND windowHandle) {
|
428
|
-
auto autoComboBox = gcnew AutomatedComboBox(windowHandle);
|
429
|
-
return autoComboBox->SelectedIndex;
|
430
|
-
}
|
431
|
-
|
432
|
-
__declspec ( dllexport ) bool RA_GetComboValueByIndex(const HWND windowHandle, const int whichItem, char* comboValue, const int comboValueSize) {
|
433
|
-
auto autoComboBox = gcnew AutomatedComboBox(windowHandle);
|
434
|
-
return autoComboBox->GetValueByIndex(whichItem, comboValue, comboValueSize);
|
435
|
-
}
|
436
|
-
|
437
|
-
__declspec ( dllexport ) bool RA_SelectComboByIndex(const HWND windowHandle, const int whichItem) {
|
438
|
-
auto autoComboBox = gcnew AutomatedComboBox(windowHandle);
|
439
|
-
return autoComboBox->SelectByIndex(whichItem);
|
440
|
-
}
|
441
|
-
|
442
|
-
__declspec ( dllexport ) int RA_SelectComboByValue(IUIAutomationElement *pElement, char *pValue) {
|
443
|
-
UIA_HWND windowHandle = 0;
|
444
|
-
pElement->get_CurrentNativeWindowHandle(&windowHandle);
|
445
|
-
|
446
|
-
auto autoComboBox = gcnew AutomatedComboBox((const HWND) windowHandle);
|
447
|
-
return autoComboBox->SelectByValue(pValue);
|
448
|
-
}
|
449
|
-
|
450
|
-
__declspec ( dllexport ) void RA_SelectMenuItem(const HWND windowHandle, char* errorInfo, const int errorInfoSize, const char* arg0, ...) {
|
451
|
-
va_list arguments;
|
452
|
-
va_start(arguments, arg0);
|
453
|
-
|
454
|
-
std::list<const char*> menuItems;
|
455
|
-
|
456
|
-
const char* lastArgument = arg0;
|
457
|
-
while( NULL != lastArgument ) {
|
458
|
-
menuItems.push_back(lastArgument);
|
459
|
-
lastArgument = va_arg(arguments, const char*);
|
460
|
-
}
|
461
|
-
va_end(arguments);
|
462
|
-
|
463
|
-
SelectMenuItem(windowHandle, errorInfo, errorInfoSize, menuItems);
|
464
|
-
}
|
465
|
-
|
466
|
-
__declspec ( dllexport ) BOOL RA_MenuItemExists(const HWND windowHandle, const char* arg0, ...) {
|
467
|
-
va_list arguments;
|
468
|
-
va_start(arguments, arg0);
|
469
|
-
|
470
|
-
std::list<const char*> menuItems;
|
471
|
-
|
472
|
-
const char* lastArgument = arg0;
|
473
|
-
while( NULL != lastArgument ) {
|
474
|
-
menuItems.push_back(lastArgument);
|
475
|
-
lastArgument = va_arg(arguments, const char*);
|
476
|
-
}
|
477
|
-
va_end(arguments);
|
478
|
-
|
479
|
-
return MenuItemExists(windowHandle, menuItems);
|
480
|
-
}
|
481
|
-
|
482
|
-
__declspec ( dllexport ) int RA_GetDataItemCount(const HWND windowHandle) {
|
483
|
-
try {
|
484
|
-
auto tableControl = gcnew AutomatedTable(windowHandle);
|
485
|
-
return tableControl->RowCount;
|
486
|
-
} catch(Exception^ e) {
|
487
|
-
Console::WriteLine(e->ToString());
|
488
|
-
}
|
489
|
-
}
|
490
|
-
|
491
|
-
__declspec ( dllexport ) bool RA_DataItemExistsByValue(const HWND windowHandle, const char* whichItem) {
|
492
|
-
try {
|
493
|
-
auto tableControl = gcnew AutomatedTable(windowHandle);
|
494
|
-
return tableControl->Exists(whichItem);
|
495
|
-
} catch(Exception^ e) {
|
496
|
-
Console::WriteLine(e->ToString());
|
497
|
-
return false;
|
498
|
-
}
|
499
|
-
}
|
500
|
-
|
501
|
-
__declspec ( dllexport ) bool RA_DataItemExists(const HWND windowHandle, const int whichItemIndex, const int whichColumnIndex) {
|
502
|
-
try {
|
503
|
-
auto tableControl = gcnew AutomatedTable(windowHandle);
|
504
|
-
return tableControl->Exists(whichItemIndex, whichColumnIndex);
|
505
|
-
} catch(Exception^ e) {
|
506
|
-
Console::WriteLine(e->ToString());
|
507
|
-
return false;
|
508
|
-
}
|
509
|
-
}
|
510
|
-
|
511
|
-
__declspec ( dllexport ) void RA_CellValueAt(const HWND windowHandle, const int row, const int column, char *foundValue, const int foundValueLength) {
|
512
|
-
try {
|
513
|
-
auto tableControl = gcnew AutomatedTable(windowHandle);
|
514
|
-
auto rowValue = tableControl->ValueAt(row, column);
|
515
|
-
StringHelper::CopyToUnmanagedString(rowValue, foundValue, foundValueLength);
|
516
|
-
} catch(Exception^ e) {
|
517
|
-
Console::WriteLine(e->ToString());
|
518
|
-
}
|
519
|
-
}
|
520
|
-
|
521
|
-
__declspec ( dllexport ) void RA_SelectDataItem(const HWND windowHandle, const int dataItemIndex) {
|
522
|
-
try {
|
523
|
-
auto tableControl = gcnew AutomatedTable(windowHandle);
|
524
|
-
tableControl->Select(dataItemIndex);
|
525
|
-
} catch(Exception^ e) {
|
526
|
-
Console::WriteLine(e->ToString());
|
527
|
-
}
|
528
|
-
}
|
529
|
-
|
530
317
|
__declspec ( dllexport ) void RA_ExpandItemByValue(const HWND windowHandle, const char* whichItem) {
|
531
318
|
try {
|
532
319
|
auto expandCollapseHelper = gcnew ExpandCollapseHelper();
|
@@ -563,21 +350,3 @@ extern "C" {
|
|
563
350
|
}
|
564
351
|
}
|
565
352
|
}
|
566
|
-
|
567
|
-
BOOL MenuItemExists(const HWND windowHandle, std::list<const char*>& menuItems)
|
568
|
-
{
|
569
|
-
auto menuSelector = gcnew MenuItemSelector();
|
570
|
-
return menuSelector->MenuItemExists(windowHandle, menuItems);
|
571
|
-
}
|
572
|
-
|
573
|
-
void SelectMenuItem(const HWND windowHandle, char* errorInfo, const int errorInfoSize, std::list<const char*>& menuItems)
|
574
|
-
{
|
575
|
-
try {
|
576
|
-
auto menuSelector = gcnew MenuItemSelector();
|
577
|
-
menuSelector->SelectMenuPath(windowHandle, menuItems);
|
578
|
-
} catch(Exception^ e) {
|
579
|
-
if( errorInfo ) {
|
580
|
-
StringHelper::CopyToUnmanagedString(e->ToString(), errorInfo, errorInfoSize);
|
581
|
-
}
|
582
|
-
}
|
583
|
-
}
|