Update native bridge to UI Automation for speed and reliability
Native UI Automation bridge redesigned for speed and reliability. The bridge library has been renamed to UiaBridge. Native components use VS 2010 C++ and .Net 4.
This commit is contained in:
40
native/uiabridge/AssemblyInfo.cpp
Normal file
40
native/uiabridge/AssemblyInfo.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Reflection;
|
||||
using namespace System::Runtime::CompilerServices;
|
||||
using namespace System::Runtime::InteropServices;
|
||||
using namespace System::Security::Permissions;
|
||||
|
||||
//
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
//
|
||||
[assembly:AssemblyTitleAttribute("uiabridge")];
|
||||
[assembly:AssemblyDescriptionAttribute("")];
|
||||
[assembly:AssemblyConfigurationAttribute("")];
|
||||
[assembly:AssemblyCompanyAttribute("na")];
|
||||
[assembly:AssemblyProductAttribute("uiabridge")];
|
||||
[assembly:AssemblyCopyrightAttribute("Copyright (c) na 2014")];
|
||||
[assembly:AssemblyTrademarkAttribute("")];
|
||||
[assembly:AssemblyCultureAttribute("")];
|
||||
|
||||
//
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the value or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly:AssemblyVersionAttribute("1.0.*")];
|
||||
|
||||
[assembly:ComVisible(false)];
|
||||
|
||||
[assembly:CLSCompliantAttribute(true)];
|
||||
|
||||
[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
|
||||
10
native/uiabridge/Global.cpp
Normal file
10
native/uiabridge/Global.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* Copyright 2014, Synthuse.org
|
||||
* Released under the Apache Version 2.0 License.
|
||||
*
|
||||
* last modified by ejakubowski7@gmail.com
|
||||
*/
|
||||
#include "stdafx.h"
|
||||
#include "Global.h"
|
||||
#include "uiabridge.h"
|
||||
using namespace uiabridge;
|
||||
21
native/uiabridge/Global.h
Normal file
21
native/uiabridge/Global.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright 2014, Synthuse.org
|
||||
* Released under the Apache Version 2.0 License.
|
||||
*
|
||||
* last modified by ejakubowski7@gmail.com
|
||||
*/
|
||||
#pragma once
|
||||
#include "uiabridge.h"
|
||||
using namespace uiabridge;
|
||||
namespace Globals
|
||||
{
|
||||
using namespace System;
|
||||
|
||||
public ref class Global
|
||||
{
|
||||
public:
|
||||
static AutomationBridge ^AUTO_BRIDGE = nullptr;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
8
native/uiabridge/ReadMe.txt
Normal file
8
native/uiabridge/ReadMe.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
========================================================================
|
||||
DYNAMIC LINK LIBRARY : uiabridge Project Overview
|
||||
========================================================================
|
||||
Created By Edward Jakubowski ejakubowski7@gmail.com
|
||||
|
||||
Description:
|
||||
This is a bridge for java to access .net 4 UI Automation libraries. This
|
||||
library enables Synthuse to access and automate WinForms, WPF and Silverlight apps.
|
||||
6
native/uiabridge/Stdafx.cpp
Normal file
6
native/uiabridge/Stdafx.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// uiabridge.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
#include <msclr/marshal.h>
|
||||
7
native/uiabridge/Stdafx.h
Normal file
7
native/uiabridge/Stdafx.h
Normal file
@@ -0,0 +1,7 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently,
|
||||
// but are changed infrequently
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
BIN
native/uiabridge/app.ico
Normal file
BIN
native/uiabridge/app.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
native/uiabridge/app.rc
Normal file
BIN
native/uiabridge/app.rc
Normal file
Binary file not shown.
6
native/uiabridge/build.bat
Normal file
6
native/uiabridge/build.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
REM set path=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;%path%
|
||||
|
||||
%WinDir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /p:configuration=release /p:platform=x64 %*
|
||||
%WinDir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /p:configuration=release /p:platform=win32 %*
|
||||
|
||||
pause
|
||||
157
native/uiabridge/org_synthuse_UiaBridge.cpp
Normal file
157
native/uiabridge/org_synthuse_UiaBridge.cpp
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright 2014, Synthuse.org
|
||||
* Released under the Apache Version 2.0 License.
|
||||
*
|
||||
* last modified by ejakubowski7@gmail.com
|
||||
*/
|
||||
#include "stdafx.h"
|
||||
#include <msclr/marshal.h> //using namespace msclr::interop;
|
||||
#include "org_synthuse_UiaBridge.h"
|
||||
#include "uiabridge.h"
|
||||
#include "Global.h"
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Windows::Automation;
|
||||
using namespace msclr::interop;
|
||||
using namespace Globals;
|
||||
using namespace uiabridge;
|
||||
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: initialize
|
||||
* Signature: (Ljava/lang/String;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_initialize(JNIEnv *env, jobject obj, jstring jproperties)
|
||||
{
|
||||
Global::AUTO_BRIDGE = gcnew AutomationBridge();
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: shutdown
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_shutdown(JNIEnv *env, jobject obj)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: addEnumFilter
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_synthuse_UiaBridge_addEnumFilter(JNIEnv *env, jobject obj, jstring jpropertyName, jstring jpropertyValue)
|
||||
{
|
||||
const char *propertyName = env->GetStringUTFChars(jpropertyValue, 0);//convert string
|
||||
const char *propertyValue = env->GetStringUTFChars(jpropertyValue, 0);//convert string
|
||||
return (jint)Global::AUTO_BRIDGE->addEnumFilter(marshal_as<String ^>(propertyName), marshal_as<String ^>(propertyValue));
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: clearEnumFilters
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_clearEnumFilters(JNIEnv *env, jobject obj)
|
||||
{
|
||||
Global::AUTO_BRIDGE->clearEnumFilters();
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: enumWindowInfo
|
||||
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL Java_org_synthuse_UiaBridge_enumWindowInfo__Ljava_lang_String_2(JNIEnv *env, jobject obj, jstring jproperties)
|
||||
{
|
||||
const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string
|
||||
array<System::String ^> ^mwinInfo = Global::AUTO_BRIDGE->enumWindowInfo(marshal_as<String ^>(properties));
|
||||
if (mwinInfo == nullptr)
|
||||
return NULL;
|
||||
//create result object array to the same size as the managed children Ids string array
|
||||
jclass stringClass = env->FindClass("java/lang/String");
|
||||
jobjectArray results = env->NewObjectArray(mwinInfo->Length, stringClass, 0);
|
||||
marshal_context context; //lets you marshal managed classes to unmanaged types
|
||||
//char **childrenIds = new char *[mchildrenIds->Length];
|
||||
for(int i = 0 ; i < mwinInfo->Length ; i++)
|
||||
{
|
||||
//childrenIds[i] = (char *)context.marshal_as<const char *>(mchildrenIds[i]);
|
||||
//env->SetObjectArrayElement(results, i, env->GetStringUTFChars(childrenIds[i], 0)
|
||||
env->SetObjectArrayElement(results, i, env->NewStringUTF(context.marshal_as<const char *>(mwinInfo[i])));
|
||||
}
|
||||
//delete[] childrenIds;
|
||||
env->ReleaseStringUTFChars(jproperties, properties); //release string
|
||||
return results;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: enumWindowInfo
|
||||
* Signature: (ILjava/lang/String;)[Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL Java_org_synthuse_UiaBridge_enumWindowInfo__ILjava_lang_String_2(JNIEnv *env, jobject obj, jint jwindowHandle, jstring jproperties)
|
||||
{
|
||||
const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string
|
||||
array<System::String ^> ^mwinInfo = Global::AUTO_BRIDGE->enumWindowInfo(System::IntPtr(jwindowHandle), marshal_as<String ^>(properties));
|
||||
if (mwinInfo == nullptr)
|
||||
return NULL;
|
||||
//create result object array to the same size as the managed children Ids string array
|
||||
jclass stringClass = env->FindClass("java/lang/String");
|
||||
jobjectArray results = env->NewObjectArray(mwinInfo->Length, stringClass, 0);
|
||||
marshal_context context; //lets you marshal managed classes to unmanaged types
|
||||
//char **childrenIds = new char *[mchildrenIds->Length];
|
||||
for(int i = 0 ; i < mwinInfo->Length ; i++)
|
||||
{
|
||||
//childrenIds[i] = (char *)context.marshal_as<const char *>(mchildrenIds[i]);
|
||||
//env->SetObjectArrayElement(results, i, env->GetStringUTFChars(childrenIds[i], 0)
|
||||
env->SetObjectArrayElement(results, i, env->NewStringUTF(context.marshal_as<const char *>(mwinInfo[i])));
|
||||
}
|
||||
//delete[] childrenIds;
|
||||
env->ReleaseStringUTFChars(jproperties, properties); //release string
|
||||
return results;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (IILjava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__IILjava_lang_String_2(JNIEnv *env, jobject obj, jint jx, jint jy, jstring jproperties)
|
||||
{
|
||||
const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string
|
||||
System::String ^mwinInfo = Global::AUTO_BRIDGE->getWindowInfo(jx, jy, marshal_as<String ^>(properties));
|
||||
env->ReleaseStringUTFChars(jproperties, properties); //release string
|
||||
marshal_context context;
|
||||
return env->NewStringUTF(context.marshal_as<const char *>(mwinInfo));
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (ILjava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__ILjava_lang_String_2(JNIEnv *env, jobject obj, jint jwindowHandle, jstring jproperties)
|
||||
{
|
||||
const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string
|
||||
System::String ^mwinInfo = Global::AUTO_BRIDGE->getWindowInfo(System::IntPtr(jwindowHandle), marshal_as<String ^>(properties));
|
||||
env->ReleaseStringUTFChars(jproperties, properties); //release string
|
||||
marshal_context context;
|
||||
return env->NewStringUTF(context.marshal_as<const char *>(mwinInfo));
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__Ljava_lang_String_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jstring jruntimeIdStr, jstring jproperties)
|
||||
{
|
||||
const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string
|
||||
const char *runtimeIdStr = env->GetStringUTFChars(jruntimeIdStr, 0);//convert string
|
||||
System::String ^mwinInfo = Global::AUTO_BRIDGE->getWindowInfo(marshal_as<String ^>(runtimeIdStr), marshal_as<String ^>(properties));
|
||||
env->ReleaseStringUTFChars(jruntimeIdStr, runtimeIdStr); //release string
|
||||
env->ReleaseStringUTFChars(jproperties, properties); //release string
|
||||
marshal_context context;
|
||||
return env->NewStringUTF(context.marshal_as<const char *>(mwinInfo));
|
||||
}
|
||||
85
native/uiabridge/org_synthuse_UiaBridge.h
Normal file
85
native/uiabridge/org_synthuse_UiaBridge.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class org_synthuse_UiaBridge */
|
||||
|
||||
#ifndef _Included_org_synthuse_UiaBridge
|
||||
#define _Included_org_synthuse_UiaBridge
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: initialize
|
||||
* Signature: (Ljava/lang/String;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_initialize
|
||||
(JNIEnv *, jobject, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: shutdown
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_shutdown
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: addEnumFilter
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_synthuse_UiaBridge_addEnumFilter
|
||||
(JNIEnv *, jobject, jstring, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: clearEnumFilters
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_synthuse_UiaBridge_clearEnumFilters
|
||||
(JNIEnv *, jobject);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: enumWindowInfo
|
||||
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL Java_org_synthuse_UiaBridge_enumWindowInfo__Ljava_lang_String_2
|
||||
(JNIEnv *, jobject, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: enumWindowInfo
|
||||
* Signature: (ILjava/lang/String;)[Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jobjectArray JNICALL Java_org_synthuse_UiaBridge_enumWindowInfo__ILjava_lang_String_2
|
||||
(JNIEnv *, jobject, jint, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (IILjava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__IILjava_lang_String_2
|
||||
(JNIEnv *, jobject, jint, jint, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (ILjava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__ILjava_lang_String_2
|
||||
(JNIEnv *, jobject, jint, jstring);
|
||||
|
||||
/*
|
||||
* Class: org_synthuse_UiaBridge
|
||||
* Method: getWindowInfo
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_org_synthuse_UiaBridge_getWindowInfo__Ljava_lang_String_2Ljava_lang_String_2
|
||||
(JNIEnv *, jobject, jstring, jstring);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
3
native/uiabridge/resource.h
Normal file
3
native/uiabridge/resource.h
Normal file
@@ -0,0 +1,3 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by app.rc
|
||||
422
native/uiabridge/uiabridge.cpp
Normal file
422
native/uiabridge/uiabridge.cpp
Normal file
@@ -0,0 +1,422 @@
|
||||
/*
|
||||
* Copyright 2014, Synthuse.org
|
||||
* Released under the Apache Version 2.0 License.
|
||||
*
|
||||
* last modified by ejakubowski7@gmail.com
|
||||
*/
|
||||
// This is the main DLL file.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "uiabridge.h"
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Collections::Generic;
|
||||
using namespace System::Windows::Automation;
|
||||
using namespace uiabridge;
|
||||
|
||||
AutomationBridge::AutomationBridge()
|
||||
{
|
||||
enumFilters = gcnew Dictionary<System::String ^, System::String ^>();
|
||||
cacheRequest = nullptr;
|
||||
initializeCache();
|
||||
}
|
||||
|
||||
AutomationBridge::~AutomationBridge()
|
||||
{
|
||||
enumFilters->Clear();
|
||||
if (cacheRequest != nullptr)
|
||||
cacheRequest->Pop(); //disable UI Automation Cache
|
||||
//Console::WriteLine("disposing of AutomationBridge");
|
||||
}
|
||||
|
||||
void AutomationBridge::initializeCache()
|
||||
{
|
||||
cacheRequest = gcnew CacheRequest();
|
||||
//cacheRequest->AutomationElementMode = AutomationElementMode::Full;
|
||||
cacheRequest->TreeFilter = Automation::RawViewCondition;
|
||||
cacheRequest->TreeScope = TreeScope::Element;// | TreeScope::Children;
|
||||
/*
|
||||
cacheRequest->Add(AutomationElement::RuntimeIdProperty);
|
||||
cacheRequest->Add(AutomationElement::ProcessIdProperty);
|
||||
cacheRequest->Add(AutomationElement::FrameworkIdProperty);
|
||||
cacheRequest->Add(AutomationElement::LocalizedControlTypeProperty);
|
||||
cacheRequest->Add(AutomationElement::ControlTypeProperty);
|
||||
cacheRequest->Add(AutomationElement::ClassNameProperty);
|
||||
cacheRequest->Add(AutomationElement::NameProperty);
|
||||
cacheRequest->Add(AutomationElement::BoundingRectangleProperty);
|
||||
*/
|
||||
System::String ^cachedPropStr = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ControlTypeProperty,ClassNameProperty,NameProperty,BoundingRectangleProperty";
|
||||
array<AutomationProperty^> ^rootProperties = AutomationElement::RootElement->GetSupportedProperties();
|
||||
List<AutomationProperty^> ^cacheList = gcnew List<AutomationProperty^>();
|
||||
if (cachedPropStr->Contains(L"NativeWindowHandleProperty")) //special property not in the root property list
|
||||
{
|
||||
cacheList->Add(AutomationElement::NativeWindowHandleProperty);
|
||||
cacheRequest->Add(AutomationElement::NativeWindowHandleProperty);
|
||||
}
|
||||
for each(AutomationProperty ^ap in rootProperties) //loop through all supported Properties for a child
|
||||
{
|
||||
System::String ^currentPropertyStr = L""; //current property values
|
||||
System::String ^shortPropName = L" null ";
|
||||
if (ap->ProgrammaticName->Contains(L".")) //get short Property name
|
||||
shortPropName = ap->ProgrammaticName->Substring(ap->ProgrammaticName->IndexOf(L".") + 1);
|
||||
if (cachedPropStr->Contains(shortPropName) || cachedPropStr->Contains(ap->ProgrammaticName))
|
||||
{
|
||||
cacheList->Add(ap);// add property to cachedRootProperties
|
||||
cacheRequest->Add(ap); // add property to cacheRequest
|
||||
//Console::WriteLine("caching property {0}", ap->ProgrammaticName);
|
||||
}
|
||||
}
|
||||
cachedRootProperties = cacheList->ToArray();
|
||||
cacheRequest->Push(); //enable UI Automation Cache
|
||||
//cachedRootProperties = AutomationElement::RootElement->GetSupportedProperties();
|
||||
}
|
||||
|
||||
int AutomationBridge::addEnumFilter(System::String ^propertyName, System::String ^propertyValue)
|
||||
{
|
||||
enumFilters->Add(propertyName, propertyValue);
|
||||
return enumFilters->Count;
|
||||
}
|
||||
|
||||
void AutomationBridge::clearEnumFilters()
|
||||
{
|
||||
enumFilters->Clear();
|
||||
}
|
||||
|
||||
Boolean AutomationBridge::isElementFiltered(System::Windows::Automation::AutomationElement ^element)
|
||||
{
|
||||
return isElementFiltered(element, nullptr);
|
||||
}
|
||||
|
||||
Boolean AutomationBridge::isElementFiltered(System::Windows::Automation::AutomationElement ^element, List<System::String ^> ^filterModifierList)
|
||||
{
|
||||
Boolean result = false;
|
||||
int filterMatchCount = 0;
|
||||
if (enumFilters->Count == 0)
|
||||
return result;
|
||||
array<AutomationProperty^> ^aps = cachedRootProperties;//element->GetSupportedProperties();
|
||||
for each(AutomationProperty ^ap in aps) //loop through all supported Properties for a child
|
||||
{
|
||||
System::String ^currentPropertyStr = L""; //current property values
|
||||
System::String ^shortPropName = L" null ";
|
||||
if (ap->ProgrammaticName->Contains(L".")) //get short Property name
|
||||
shortPropName = ap->ProgrammaticName->Substring(ap->ProgrammaticName->IndexOf(L".") + 1);
|
||||
//System::Console::WriteLine("property: {0}", shortPropName);
|
||||
for each(System::String ^key in enumFilters->Keys)
|
||||
{
|
||||
if (filterModifierList != nullptr)
|
||||
if (filterModifierList->Contains(key) && key->StartsWith(PARENT_MODIFIER+ "/") ) // modifier has been applied and filters should be ignored
|
||||
{
|
||||
++filterMatchCount;
|
||||
//System::Console::WriteLine("PARENT_MODIFIER {0}", key);
|
||||
continue;
|
||||
}
|
||||
else if(filterModifierList->Contains(key) && key->StartsWith(FIRST_MODIFIER+ "/")) //first already found stop!
|
||||
{
|
||||
//System::Console::WriteLine("FIRST_MODIFIER {0}", key);
|
||||
return true;
|
||||
}
|
||||
System::String ^filterProp = key;
|
||||
System::String ^modifier = L"";
|
||||
int pos = key->IndexOf(L"/");
|
||||
if (pos != -1)//tree modifier
|
||||
{
|
||||
modifier = filterProp->Substring(0, pos);
|
||||
filterProp = filterProp->Substring(pos+1);
|
||||
//System::Console::WriteLine("modifier: {0}, {1}, {2}", modifier, filterProp, key);
|
||||
}
|
||||
if (shortPropName->Equals(filterProp) || ap->ProgrammaticName->Equals(filterProp))
|
||||
{//this element has a matching filter property
|
||||
//System::Console::WriteLine("matched property: {0}", filterProp);
|
||||
System::String ^valStr = L"";
|
||||
if (ap->ProgrammaticName->Equals(L"AutomationElementIdentifiers.RuntimeIdProperty"))
|
||||
{//runtimeId are int array so need to test it differently
|
||||
array<System::Int32> ^idArray = (array<System::Int32> ^)element->GetCurrentPropertyValue(ap);
|
||||
for each(System::Int32 val in idArray)
|
||||
{
|
||||
valStr += System::Convert::ToString(val) + L"-";
|
||||
}
|
||||
valStr = valStr->TrimEnd('-');
|
||||
//System::Console::WriteLine("runtimeId: {0}", valStr);
|
||||
}
|
||||
else //all other property types that are strings
|
||||
{
|
||||
valStr = element->GetCachedPropertyValue(ap)->ToString();
|
||||
//valStr = element->GetCurrentPropertyValue(ap)->ToString();
|
||||
}
|
||||
//System::Console::WriteLine("test property vals: {0} , {1}", valStr, enumFilters[key]);
|
||||
|
||||
if (valStr->Equals(enumFilters[key])) // value matches filter value
|
||||
{
|
||||
//System::Console::WriteLine("matched property vals: {0} , {1}", valStr, enumFilters[key]);
|
||||
//result = false;
|
||||
++filterMatchCount;
|
||||
if (filterModifierList != nullptr)
|
||||
if (modifier->Equals(PARENT_MODIFIER)) //if modifier is parent then add to modifier list
|
||||
{
|
||||
//System::Console::WriteLine("modifier added1 {0}", key);
|
||||
filterModifierList->Add(key);
|
||||
}
|
||||
else if(modifier->Equals(FIRST_MODIFIER)) {
|
||||
//System::Console::WriteLine("first modifier added1 {0} {1}", key, filterModifierList->Count);
|
||||
//for each (System::String ^mod in filterModifierList)
|
||||
// System::Console::WriteLine("mod {0}", mod);
|
||||
filterModifierList->Add(key);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else// not matched
|
||||
if (filterModifierList != nullptr)
|
||||
if (modifier->Equals(ALL_MODIFIER)) //doesn't matter if ALL modifier doesn't match, need to keep searching
|
||||
{
|
||||
//System::Console::WriteLine("modifier added2 {0}", key);
|
||||
filterModifierList->Add(key);
|
||||
}
|
||||
else if(modifier->Equals(FIRST_MODIFIER))
|
||||
filterModifierList->Add(ALL_MODIFIER + "/" + filterProp);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//System::Console::WriteLine("filterMatchCount: {0}", filterMatchCount);
|
||||
if (filterMatchCount > 0)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
//return result;
|
||||
}
|
||||
|
||||
void AutomationBridge::processFilterModifier(Boolean filtered, Boolean modifierChanged, List<System::String ^> ^filterModifierList)
|
||||
{
|
||||
if (!filtered) //not filtered so return element
|
||||
{
|
||||
//winInfoList->Add(getWindowInfo(currentElement, properties));
|
||||
//winInfoList->AddRange(enumWindowInfo(currentElement, properties, filterModifierList));
|
||||
if (modifierChanged && filterModifierList[filterModifierList->Count - 1]->StartsWith(FIRST_MODIFIER) == false) //modifier was added and needs to be removed
|
||||
{// don't remove First modifier
|
||||
//System::Console::WriteLine("modifier removed1 {0}", filterModifierList[filterModifierList->Count - 1]);
|
||||
filterModifierList->RemoveAt(filterModifierList->Count - 1);
|
||||
}
|
||||
}
|
||||
else //filtered, but if modifier used keep searching children
|
||||
{
|
||||
if (modifierChanged) //modifier was added and needs to be removed (ALL)
|
||||
{
|
||||
//winInfoList->AddRange(enumWindowInfo(currentElement, properties, filterModifierList));
|
||||
if (filterModifierList[filterModifierList->Count - 1]->StartsWith(FIRST_MODIFIER) == false)// don't remove First modifier
|
||||
{
|
||||
//System::Console::WriteLine("modifier removed2 {0}", filterModifierList[filterModifierList->Count - 1]);
|
||||
filterModifierList->RemoveAt(filterModifierList->Count - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
System::String ^ AutomationBridge::getRuntimeIdFromElement(System::Windows::Automation::AutomationElement ^element)
|
||||
{
|
||||
System::String ^result = L"";
|
||||
System::Object ^currentVal = element->GetCurrentPropertyValue(AutomationElement::RuntimeIdProperty);
|
||||
if (currentVal != nullptr)
|
||||
{
|
||||
array<System::Int32> ^idArray = (array<System::Int32> ^)currentVal;
|
||||
for each(System::Int32 val in idArray)
|
||||
{
|
||||
result += System::Convert::ToString(val) + L"-";
|
||||
}
|
||||
result = result->TrimEnd('-');
|
||||
//System::Console::WriteLine("id: {0}", result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
array<System::String ^> ^ AutomationBridge::enumWindowInfo(System::String ^properties)
|
||||
{
|
||||
return enumWindowInfo(AutomationElement::RootElement, properties);
|
||||
}
|
||||
|
||||
array<System::String ^> ^ AutomationBridge::enumWindowInfo(System::IntPtr windowHandle, System::String ^properties)
|
||||
{
|
||||
AutomationElement ^element = AutomationElement::FromHandle(windowHandle);
|
||||
List<System::String ^> ^winInfoList = gcnew List<System::String ^>();
|
||||
if (!isElementFiltered(element)) //test parent should be filtered
|
||||
winInfoList->Add(getWindowInfo(element, properties));
|
||||
winInfoList->AddRange(enumWindowInfo(element, properties));
|
||||
return winInfoList->ToArray();
|
||||
}
|
||||
|
||||
array<System::String ^> ^ AutomationBridge::enumWindowInfo(AutomationElement ^element, System::String ^properties)
|
||||
{
|
||||
List<System::String ^> ^filterModifierList = gcnew List<System::String ^>(); //can change descendants filters based on parent's filters
|
||||
return enumWindowInfo(element, properties, filterModifierList);
|
||||
}
|
||||
|
||||
array<System::String ^> ^ AutomationBridge::enumWindowInfo(AutomationElement ^element, System::String ^properties, List<System::String ^> ^filterModifierList)
|
||||
{
|
||||
List<System::String ^> ^winInfoList = gcnew List<System::String ^>();
|
||||
if (element == nullptr)
|
||||
return winInfoList->ToArray();
|
||||
TreeWalker ^tw = TreeWalker::RawViewWalker;
|
||||
//System::Console::WriteLine("get info: {0}", getWindowInfo(element, properties));
|
||||
//AutomationElement ^currentElement = tw->GetFirstChild(element, cacheRequest);
|
||||
AutomationElement ^currentElement = nullptr;
|
||||
/*if (element->CachedChildren != nullptr)
|
||||
{
|
||||
System::Console::WriteLine("using cached child");
|
||||
currentElement = element->CachedChildren[0];
|
||||
}
|
||||
else*/
|
||||
{
|
||||
//System::Console::WriteLine("not cached child");
|
||||
currentElement = tw->GetFirstChild(element, cacheRequest);
|
||||
}
|
||||
if (currentElement == nullptr)
|
||||
{
|
||||
//System::Console::WriteLine("no children {0}", element->CachedChildren->Count);
|
||||
//System::Console::WriteLine("no children");
|
||||
return winInfoList->ToArray();
|
||||
}
|
||||
//else
|
||||
// System::Console::WriteLine("yes children");
|
||||
|
||||
while (currentElement != nullptr)
|
||||
{
|
||||
try
|
||||
{
|
||||
int fmlOriginalSize = filterModifierList->Count;
|
||||
Boolean filtered = isElementFiltered(currentElement, filterModifierList);
|
||||
Boolean modifierChanged = fmlOriginalSize != filterModifierList->Count;
|
||||
if (!filtered) //not filtered so return element
|
||||
{
|
||||
winInfoList->Add(getWindowInfo(currentElement, properties));
|
||||
winInfoList->AddRange(enumWindowInfo(currentElement, properties, filterModifierList));
|
||||
}
|
||||
else //filtered, but if modifier used keep searching children
|
||||
{
|
||||
if (modifierChanged) //modifier was added search children
|
||||
winInfoList->AddRange(enumWindowInfo(currentElement, properties, filterModifierList));
|
||||
}
|
||||
processFilterModifier(filtered, modifierChanged, filterModifierList); //cleans filterModifierList
|
||||
//System::Console::WriteLine("element: {0}", currentElement);
|
||||
//currentElement->
|
||||
currentElement = tw->GetNextSibling(currentElement, cacheRequest);
|
||||
} catch (Exception ^ex)
|
||||
{
|
||||
System::Console::WriteLine("Exception: {0} {1}", ex->Message, ex->StackTrace);
|
||||
}
|
||||
}
|
||||
return winInfoList->ToArray();
|
||||
}
|
||||
|
||||
System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, System::String ^properties)
|
||||
{
|
||||
System::String ^resultProperties = L"";
|
||||
System::String ^propertyNameErrorCheck = L"";
|
||||
try
|
||||
{
|
||||
//when wildcard is enabled it will pull all property names & values
|
||||
System::Boolean wildcardEnabled = false;
|
||||
if (properties->Equals(L"*"))
|
||||
wildcardEnabled = true;
|
||||
|
||||
//create array for keeping order of properties
|
||||
System::String ^delim = L",";
|
||||
array<System::String ^> ^propSpltArray = properties->Split(delim->ToCharArray());
|
||||
TreeWalker ^tw = TreeWalker::ControlViewWalker;
|
||||
System::Int32 count = 0;
|
||||
array<AutomationProperty^> ^aps = cachedRootProperties;//element->GetSupportedProperties();
|
||||
array<System::String ^> ^propValues = gcnew array<System::String ^>(propSpltArray->Length);//keep order
|
||||
System::String ^wildcardProperties = L"";
|
||||
if (wildcardEnabled) {
|
||||
wildcardProperties += "ParentRuntimeIdProperty:" + getRuntimeIdFromElement(tw->GetParent(element, cacheRequest)) + ",";
|
||||
//propValues = gcnew array<System::String ^>(aps->Length +1 );//add one for parent property since it doesn't exist
|
||||
}
|
||||
for(int i=0 ; i < propValues->Length ; i++)
|
||||
{
|
||||
propValues[i] = L"";
|
||||
if (propSpltArray[i]->Equals("ParentRuntimeIdProperty"))//custom property for getting parent
|
||||
{
|
||||
propValues[i] = getRuntimeIdFromElement(tw->GetParent(element, cacheRequest));
|
||||
}
|
||||
}
|
||||
for each(AutomationProperty ^ap in aps) //loop through all supported Properties for a child
|
||||
{
|
||||
propertyNameErrorCheck = ap->ProgrammaticName;//debug purposes
|
||||
System::String ^currentPropertyStr = L""; //current property values
|
||||
//System::Console::WriteLine("property: {0}", ap->ProgrammaticName);
|
||||
System::String ^shortPropName = L" null ";
|
||||
if (ap->ProgrammaticName->Contains(L"."))
|
||||
shortPropName = ap->ProgrammaticName->Substring(ap->ProgrammaticName->IndexOf(L".") + 1);
|
||||
if (properties->Contains(shortPropName) || properties->Contains(ap->ProgrammaticName) || ap->ProgrammaticName->Equals(properties) || wildcardEnabled)
|
||||
{
|
||||
//System::Console::WriteLine("shortPropName: {0}", shortPropName);
|
||||
//System::Object ^currentVal = element->GetCurrentPropertyValue(ap);
|
||||
System::Object ^currentVal = element->GetCachedPropertyValue(ap);
|
||||
if (currentVal == nullptr)
|
||||
continue;
|
||||
if (ap->ProgrammaticName->Equals(L"AutomationElementIdentifiers.RuntimeIdProperty"))
|
||||
{
|
||||
array<System::Int32> ^idArray = (array<System::Int32> ^)currentVal;
|
||||
for each(System::Int32 val in idArray)
|
||||
{
|
||||
currentPropertyStr += System::Convert::ToString(val) + L"-";
|
||||
}
|
||||
currentPropertyStr = currentPropertyStr->TrimEnd('-');
|
||||
//System::Console::WriteLine("id: {0}", result);
|
||||
}
|
||||
else//not runtimeId which is an Int32[]
|
||||
{
|
||||
currentPropertyStr = currentVal->ToString();
|
||||
currentPropertyStr = currentPropertyStr->Replace(",",",");
|
||||
}
|
||||
}
|
||||
if (currentPropertyStr->Equals(L"")) //if there isn't a value skip
|
||||
continue;
|
||||
if (wildcardEnabled) {
|
||||
wildcardProperties += shortPropName + ":" +currentPropertyStr + ",";
|
||||
continue;
|
||||
}
|
||||
//System::Console::WriteLine("currentPropertyStr: {0}", currentPropertyStr);
|
||||
//find the correct order to return this property
|
||||
for(int i=0 ; i < propSpltArray->Length ; i++)
|
||||
{
|
||||
if (propSpltArray[i]->Equals(shortPropName) || propSpltArray[i]->Equals(ap->ProgrammaticName))
|
||||
propValues[i] = currentPropertyStr;
|
||||
}
|
||||
}
|
||||
//output properties in the correct order
|
||||
for(int i=0 ; i < propSpltArray->Length ; i++)
|
||||
resultProperties += propValues[i] + L",";
|
||||
if (wildcardEnabled)
|
||||
resultProperties += wildcardProperties;
|
||||
} catch (Exception ^ex) //when some elements close during enumeration it might cause valid exceptions
|
||||
{
|
||||
System::Console::WriteLine("Exception ({2}): {0} {1}", ex->Message, ex->StackTrace, propertyNameErrorCheck);
|
||||
}
|
||||
return resultProperties;
|
||||
|
||||
}
|
||||
|
||||
System::String ^ AutomationBridge::getWindowInfo(System::Int32 x, System::Int32 y, System::String ^properties)
|
||||
{
|
||||
AutomationElement ^element = AutomationElement::FromPoint(System::Windows::Point(x, y));
|
||||
return getWindowInfo(element, properties);
|
||||
}
|
||||
|
||||
System::String ^ AutomationBridge::getWindowInfo(System::IntPtr windowHandle, System::String ^properties)
|
||||
{
|
||||
AutomationElement ^element = AutomationElement::FromHandle(windowHandle);
|
||||
return getWindowInfo(element, properties);
|
||||
}
|
||||
|
||||
System::String ^ AutomationBridge::getWindowInfo(System::String ^runtimeIdStr, System::String ^properties)
|
||||
{
|
||||
System::String ^filter = L"First/RuntimeIdProperty"; //get first matching runtimeIdProperty
|
||||
enumFilters->Add(filter, runtimeIdStr);
|
||||
array<System::String ^> ^props = enumWindowInfo(properties);
|
||||
enumFilters->Remove(filter);
|
||||
if (props->Length > 0) //if result array has a match return first result
|
||||
return props[0];
|
||||
else
|
||||
return "";
|
||||
//return getWindowInfo(element, properties);
|
||||
}
|
||||
46
native/uiabridge/uiabridge.h
Normal file
46
native/uiabridge/uiabridge.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2014, Synthuse.org
|
||||
* Released under the Apache Version 2.0 License.
|
||||
*
|
||||
* last modified by ejakubowski7@gmail.com
|
||||
*/
|
||||
// uiabridge.h
|
||||
|
||||
#pragma once
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Collections::Generic;
|
||||
using namespace System::Windows::Automation;
|
||||
|
||||
namespace uiabridge {
|
||||
|
||||
public ref class AutomationBridge
|
||||
{
|
||||
public:
|
||||
AutomationBridge(void);
|
||||
~AutomationBridge();
|
||||
int addEnumFilter(System::String ^propertyName, System::String ^propertyValue);
|
||||
void clearEnumFilters();
|
||||
Boolean isElementFiltered(System::Windows::Automation::AutomationElement ^element);
|
||||
Boolean isElementFiltered(System::Windows::Automation::AutomationElement ^element, List<System::String ^> ^filterModifierList);
|
||||
System::String ^ getRuntimeIdFromElement(System::Windows::Automation::AutomationElement ^element);
|
||||
array<System::String ^> ^ enumWindowInfo(System::String ^properties);
|
||||
array<System::String ^> ^ enumWindowInfo(System::IntPtr windowHandle, System::String ^properties);
|
||||
array<System::String ^> ^ enumWindowInfo(AutomationElement ^element, System::String ^properties);
|
||||
array<System::String ^> ^ enumWindowInfo(AutomationElement ^element, System::String ^properties, List<System::String ^> ^filterModifierList);
|
||||
System::String ^ getWindowInfo(AutomationElement ^element, System::String ^properties);
|
||||
System::String ^ getWindowInfo(System::Int32 x, System::Int32 y, System::String ^properties);
|
||||
System::String ^ getWindowInfo(System::IntPtr windowHandle, System::String ^properties);
|
||||
System::String ^ getWindowInfo(System::String ^runtimeIdStr, System::String ^properties);
|
||||
|
||||
static System::String ^ALL_MODIFIER = L"All";// find all matching elements of this filter
|
||||
static System::String ^PARENT_MODIFIER = L"Parent";//find all children of this matching parent filter
|
||||
static System::String ^FIRST_MODIFIER = L"First"; //find first element matching this filter then stop
|
||||
private:
|
||||
void initializeCache();
|
||||
Dictionary<System::String ^, System::String ^> ^enumFilters;
|
||||
void AutomationBridge::processFilterModifier(Boolean filtered, Boolean modifierChanged, List<System::String ^> ^filterModifierList);
|
||||
CacheRequest ^cacheRequest;
|
||||
array<AutomationProperty^> ^cachedRootProperties;
|
||||
};
|
||||
}
|
||||
181
native/uiabridge/uiabridge.vcxproj
Normal file
181
native/uiabridge/uiabridge.vcxproj
Normal file
@@ -0,0 +1,181 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{BAC1B079-7B87-4396-B17F-91A86DF1AE29}</ProjectGuid>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<Keyword>ManagedCProj</Keyword>
|
||||
<RootNamespace>uiabridge</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CLRSupport>true</CLRSupport>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CLRSupport>true</CLRSupport>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<CLRSupport>true</CLRSupport>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<CLRSupport>true</CLRSupport>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>
|
||||
</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>
|
||||
</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>
|
||||
</AdditionalDependencies>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>mkdir "$(ProjectDir)bin"
|
||||
copy /Y "$(TargetPath)" "$(ProjectDir)bin\uiabridge$(PlatformArchitecture)$(TargetExt)"</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>
|
||||
</AdditionalDependencies>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>mkdir "$(ProjectDir)bin"
|
||||
copy /Y "$(TargetPath)" "$(ProjectDir)bin\uiabridge$(PlatformArchitecture)$(TargetExt)"</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="UIAutomationClient" />
|
||||
<Reference Include="UIAutomationClientsideProviders" />
|
||||
<Reference Include="UIAutomationProvider" />
|
||||
<Reference Include="UIAutomationTypes" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Global.h" />
|
||||
<ClInclude Include="org_synthuse_UiaBridge.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
<ClInclude Include="Stdafx.h" />
|
||||
<ClInclude Include="uiabridge.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="AssemblyInfo.cpp" />
|
||||
<ClCompile Include="Global.cpp" />
|
||||
<ClCompile Include="org_synthuse_UiaBridge.cpp" />
|
||||
<ClCompile Include="Stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="uiabridge.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.ico" />
|
||||
<None Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="app.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
62
native/uiabridge/uiabridge.vcxproj.filters
Normal file
62
native/uiabridge/uiabridge.vcxproj.filters
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="uiabridge.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Stdafx.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="org_synthuse_UiaBridge.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Global.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="uiabridge.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AssemblyInfo.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Stdafx.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="org_synthuse_UiaBridge.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Global.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ReadMe.txt" />
|
||||
<None Include="app.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="app.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
3
native/uiabridge/uiabridge.vcxproj.user
Normal file
3
native/uiabridge/uiabridge.vcxproj.user
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
</Project>
|
||||
Reference in New Issue
Block a user