From bc3c070ea8059acc9985c913cc1b6eba7ef70c44 Mon Sep 17 00:00:00 2001 From: Edward Jakubowski Date: Mon, 7 Apr 2014 22:19:47 -0400 Subject: [PATCH] WPF and regular Win32 windows are now supported Added support for dragging target on WPF windows and building simple xpath statements. Fixed some null results in native library and increased performance of enumerating wpf windows. Still need to tweak filters for picking up Silverlight handles too. --- native/WpfBridge/AssemblyInfo.cpp | 2 +- native/WpfBridge/WpfAutomation.cpp | 80 ++++++++++++++---- native/WpfBridge/WpfAutomation.h | 10 ++- native/WpfBridge/WpfBridge.vcxproj | 1 + native/WpfBridge/bin/wpfbridge32.dll | Bin 76288 -> 78336 bytes native/WpfBridge/bin/wpfbridge64.dll | Bin 91136 -> 92672 bytes native/WpfBridge/org_synthuse_WpfBridge.cpp | 69 ++++++++++----- native/WpfBridge/org_synthuse_WpfBridge.h | 32 +++++-- src/org/synthuse/Api.java | 1 + src/org/synthuse/Config.java | 5 ++ src/org/synthuse/SynthuseDlg.java | 11 ++- src/org/synthuse/WinPtr.java | 52 ++++++++++++ src/org/synthuse/WindowsEnumeratedXml.java | 54 ++++++++---- src/org/synthuse/WpfBridge.java | 62 +++++++++++--- src/org/synthuse/XpathManager.java | 54 +++++++++++- src/org/synthuse/commands/BaseCommand.java | 32 +++++-- src/org/synthuse/commands/MainCommands.java | 25 +++--- src/org/synthuse/commands/MouseCommands.java | 46 +++++----- .../synthuse/commands/WindowsCommands.java | 62 +++++++------- src/org/synthuse/test/WpfBridgeTest.java | 59 +++++++++++++ 20 files changed, 500 insertions(+), 157 deletions(-) create mode 100644 src/org/synthuse/WinPtr.java create mode 100644 src/org/synthuse/test/WpfBridgeTest.java diff --git a/native/WpfBridge/AssemblyInfo.cpp b/native/WpfBridge/AssemblyInfo.cpp index 118f215..8d9e333 100644 --- a/native/WpfBridge/AssemblyInfo.cpp +++ b/native/WpfBridge/AssemblyInfo.cpp @@ -37,7 +37,7 @@ using namespace System::Security::Permissions; // 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:AssemblyVersionAttribute("1.1.*")]; [assembly:ComVisible(false)]; diff --git a/native/WpfBridge/WpfAutomation.cpp b/native/WpfBridge/WpfAutomation.cpp index 31a9ee2..14e27ce 100644 --- a/native/WpfBridge/WpfAutomation.cpp +++ b/native/WpfBridge/WpfAutomation.cpp @@ -13,6 +13,7 @@ using namespace System::Windows::Automation; WpfAutomation::WpfAutomation(void) { this->frameworkId = WpfAutomation::DEFAULT_FRAMEWORK; + this->touchableOnly = true; } void WpfAutomation::setFrameworkId(System::String ^propertyValue) @@ -20,6 +21,21 @@ void WpfAutomation::setFrameworkId(System::String ^propertyValue) this->frameworkId = propertyValue; } +void WpfAutomation::setTouchableOnly(System::Boolean val) +{ + this->touchableOnly = val; +} + +System::Windows::Automation::Condition ^ WpfAutomation::getSearchConditions() +{ + array ^cons = gcnew array(3); + cons[0] = gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId);//is WPF framework + cons[1] = gcnew PropertyCondition(AutomationElement::IsEnabledProperty, this->touchableOnly);//is enabled + cons[2] = gcnew PropertyCondition(AutomationElement::IsOffscreenProperty, !this->touchableOnly);// is off screen + System::Windows::Automation::Condition ^result = gcnew System::Windows::Automation::AndCondition(cons); + return result; +} + array ^ WpfAutomation::convertRuntimeIdString(System::String ^runtimeIdValue) { System::String ^delim = L"-"; @@ -37,9 +53,9 @@ AutomationElement ^ WpfAutomation::findAutomationElementById(System::String ^run if (runtimeIdValue == nullptr || runtimeIdValue->Equals(L"")) return AutomationElement::RootElement; array ^idArray = this->convertRuntimeIdString(runtimeIdValue); - Condition ^pcFramework = gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId); + //Condition ^pcFramework = gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId); Condition ^pcRunId = gcnew PropertyCondition(AutomationElement::RuntimeIdProperty, idArray); - Condition ^frameworkAndRuntimeId = gcnew AndCondition(pcFramework, pcRunId); + Condition ^frameworkAndRuntimeId = gcnew AndCondition(getSearchConditions(), pcRunId); return AutomationElement::RootElement->FindFirst(TreeScope::Descendants, frameworkAndRuntimeId); } @@ -76,7 +92,9 @@ System::String ^ WpfAutomation::getRuntimeIdFromElement(System::Windows::Automat System::Int32 WpfAutomation::countDescendantWindows() { //AutomationElementCollection ^aec = rootElem->FindAll(TreeScope::Children, Condition::TrueCondition); - AutomationElementCollection ^aec = AutomationElement::RootElement->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = AutomationElement::RootElement->FindAll(TreeScope::Descendants, getSearchConditions()); + if (aec == nullptr) + return 0; System::Int32 result = aec->Count; //delete aec; return result; @@ -85,7 +103,9 @@ System::Int32 WpfAutomation::countDescendantWindows() System::Int32 WpfAutomation::countDescendantWindows(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, getSearchConditions()); + if (aec == nullptr) + return 0; System::Int32 result = aec->Count; //delete aec; //delete frameworkAndRuntimeId; @@ -95,7 +115,9 @@ System::Int32 WpfAutomation::countDescendantWindows(System::String ^runtimeIdVal System::Int32 WpfAutomation::countChildrenWindows() { //AutomationElementCollection ^aec = rootElem->FindAll(TreeScope::Children, Condition::TrueCondition); - AutomationElementCollection ^aec = AutomationElement::RootElement->FindAll(TreeScope::Children, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = AutomationElement::RootElement->FindAll(TreeScope::Children, getSearchConditions()); + if (aec == nullptr) + return 0; System::Int32 result = aec->Count; //delete aec; return result; @@ -104,7 +126,9 @@ System::Int32 WpfAutomation::countChildrenWindows() System::Int32 WpfAutomation::countChildrenWindows(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Children, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Children, getSearchConditions()); + if (aec == nullptr) + return 0; System::Int32 result = aec->Count; //delete aec; //delete frameworkAndRuntimeId; @@ -114,14 +138,18 @@ System::Int32 WpfAutomation::countChildrenWindows(System::String ^runtimeIdValue array ^ WpfAutomation::enumChildrenWindowIds(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Children, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Children, getSearchConditions()); + if (aec == nullptr) + return nullptr; return getRuntimeIdsFromCollection(aec); } array ^ WpfAutomation::enumDescendantWindowIds(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, getSearchConditions()); + if (aec == nullptr) + return nullptr; return getRuntimeIdsFromCollection(aec); } @@ -131,22 +159,27 @@ array ^ WpfAutomation::enumDescendantWindowIds(System::Int32 p gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId), gcnew PropertyCondition(AutomationElement::ProcessIdProperty, processId)); AutomationElement ^parent = AutomationElement::RootElement->FindFirst(TreeScope::Descendants, frameworkAndProcessId); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, getSearchConditions()); + if (aec == nullptr) + return nullptr; return getRuntimeIdsFromCollection(aec); } -array ^ WpfAutomation::EnumDescendantWindowIdsFromHandle(System::IntPtr windowHandle) +System::String ^ WpfAutomation::getRuntimeIdFromHandle(System::IntPtr windowHandle) { //AutomationElement test = AutomationElement.FromHandle(new System.IntPtr(123123)); - AutomationElement ^parent = AutomationElement::FromHandle(windowHandle); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); - return getRuntimeIdsFromCollection(aec); + AutomationElement ^target = AutomationElement::FromHandle(windowHandle); + if (target == nullptr) + return nullptr; + return getRuntimeIdFromElement(target); } -array ^ WpfAutomation::EnumDescendantWindowInfo(System::String ^runtimeIdValue, System::String ^properties) +array ^ WpfAutomation::enumDescendantWindowInfo(System::String ^runtimeIdValue, System::String ^properties) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); - AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, gcnew PropertyCondition(AutomationElement::FrameworkIdProperty, this->frameworkId)); + if (parent == nullptr) + return nullptr; + AutomationElementCollection ^aec = parent->FindAll(TreeScope::Descendants, getSearchConditions()); //create array for keeping order of properties System::String ^delim = L","; @@ -213,9 +246,19 @@ array ^ WpfAutomation::EnumDescendantWindowInfo(System::String return winInfoList; } +System::String ^ WpfAutomation::getRuntimeIdFromPoint(System::Int32 x, System::Int32 y) +{ + AutomationElement ^target = AutomationElement::FromPoint(System::Windows::Point(x,y)); + if (target == nullptr) + return nullptr; + return getRuntimeIdFromElement(target); +} + System::String ^ WpfAutomation::getParentRuntimeId(System::String ^runtimeIdValue) { AutomationElement ^target = findAutomationElementById(runtimeIdValue); + if (target == nullptr) + return nullptr; TreeWalker ^tw = TreeWalker::ControlViewWalker; AutomationElement ^parent = tw->GetParent(target); return getRuntimeIdFromElement(parent); @@ -224,6 +267,8 @@ System::String ^ WpfAutomation::getParentRuntimeId(System::String ^runtimeIdValu System::String ^ WpfAutomation::getProperty(System::String ^propertyName, System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); + if (parent == nullptr) + return nullptr; //System::Object ^currentVal = parent->GetCurrentPropertyValue(AutomationElement::RuntimeIdProperty); array ^aps = parent->GetSupportedProperties(); for each(AutomationProperty ^ap in aps) @@ -238,9 +283,12 @@ System::String ^ WpfAutomation::getProperty(System::String ^propertyName, System return nullptr; } + array ^ WpfAutomation::getProperties(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); + if (parent == nullptr) + return nullptr; array ^aps = parent->GetSupportedProperties(); array ^propStrArray = gcnew array(aps->Length); System::Int32 count = 0; @@ -258,6 +306,8 @@ array ^ WpfAutomation::getProperties(System::String ^runtimeId array ^ WpfAutomation::getPropertiesAndValues(System::String ^runtimeIdValue) { AutomationElement ^parent = findAutomationElementById(runtimeIdValue); + if (parent == nullptr) + return nullptr; array ^aps = parent->GetSupportedProperties(); array ^propStrArray = gcnew array(aps->Length); System::Int32 count = 0; diff --git a/native/WpfBridge/WpfAutomation.h b/native/WpfBridge/WpfAutomation.h index ea9308e..a22d6bc 100644 --- a/native/WpfBridge/WpfAutomation.h +++ b/native/WpfBridge/WpfAutomation.h @@ -11,6 +11,7 @@ public ref class WpfAutomation public: WpfAutomation(void); void setFrameworkId(System::String ^propertyValue); //default is WPF, but also accepts Silverlight, Win32 + void setTouchableOnly(System::Boolean val); //default is true //Descendants will walk the full tree of windows, NOT just one level of children System::Int32 countDescendantWindows(); @@ -22,11 +23,11 @@ public: array ^ enumChildrenWindowIds(System::String ^runtimeIdValue); //if runtimeIdValue is null will start at desktop array ^ enumDescendantWindowIds(System::String ^runtimeIdValue); //if runtimeIdValue is null will start at desktop array ^ enumDescendantWindowIds(System::Int32 processId); - array ^ EnumDescendantWindowIdsFromHandle(System::IntPtr windowHandle); //In all the above Enumerate methods will return a list of Runtime Ids for all related windows. - array ^ EnumDescendantWindowInfo(System::String ^runtimeIdValue, System::String ^properties); - + array ^ enumDescendantWindowInfo(System::String ^runtimeIdValue, System::String ^properties); + System::String ^ getRuntimeIdFromHandle(System::IntPtr windowHandle); + System::String ^ getRuntimeIdFromPoint(System::Int32 x, System::Int32 y); System::String ^ getParentRuntimeId(System::String ^runtimeIdValue); System::String ^ getProperty(System::String ^propertyName, System::String ^runtimeIdValue); array ^ getProperties(System::String ^runtimeIdValue); @@ -36,8 +37,11 @@ private: System::Windows::Automation::AutomationElement ^ findAutomationElementById(System::String ^runtimeIdValue); System::String ^ getRuntimeIdFromElement(System::Windows::Automation::AutomationElement ^element); array ^ getRuntimeIdsFromCollection(System::Windows::Automation::AutomationElementCollection ^collection); + System::Windows::Automation::Condition ^ getSearchConditions(); static System::String ^DEFAULT_FRAMEWORK = L"WPF"; + static System::Boolean ^DEFAULT_TOUCHABLE = true; System::String ^frameworkId; + System::Boolean ^touchableOnly; }; diff --git a/native/WpfBridge/WpfBridge.vcxproj b/native/WpfBridge/WpfBridge.vcxproj index 93b88ec..3e86389 100644 --- a/native/WpfBridge/WpfBridge.vcxproj +++ b/native/WpfBridge/WpfBridge.vcxproj @@ -148,6 +148,7 @@ copy /Y "$(TargetPath)" "$(ProjectDir)bin\wpfbridge$(PlatformArchitecture)$(Targ + diff --git a/native/WpfBridge/bin/wpfbridge32.dll b/native/WpfBridge/bin/wpfbridge32.dll index b275d903fe33a133a98d0f353f378728c29f798b..e7732cc7f95fa69cdeb65e17a183307f6e141dd1 100644 GIT binary patch literal 78336 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 Wt~1ejN9Ti`4`B)R?(a8=1OFdRz6C4* literal 76288 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 z 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, propertyValue); //release string } +/* + * Class: org_synthuse_WpfBridge + * Method: setTouchableOnly + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_org_synthuse_WpfBridge_setTouchableOnly(JNIEnv *env, jobject obj, jboolean jval) +{ + Global::WPF_AUTO->setTouchableOnly((bool)(jval == JNI_TRUE)); +} + /* * Class: org_synthuse_WpfBridge * Method: CountDescendantWindows @@ -80,7 +90,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumChildrenWindowIds { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string array ^mchildrenIds = Global::WPF_AUTO->enumChildrenWindowIds(marshal_as(runtimeIdValue)); - + if (mchildrenIds == 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(mchildrenIds->Length, stringClass, 0); @@ -107,7 +118,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string array ^mchildrenIds = Global::WPF_AUTO->enumDescendantWindowIds(marshal_as(runtimeIdValue)); - + if (mchildrenIds == 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(mchildrenIds->Length, stringClass, 0); @@ -133,7 +145,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowIds__J(JNIEnv *env, jobject obj, jlong jprocessId) { array ^mchildrenIds = Global::WPF_AUTO->enumDescendantWindowIds((System::Int32)jprocessId); - + if (mchildrenIds == 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(mchildrenIds->Length, stringClass, 0); @@ -148,22 +161,17 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI /* * Class: org_synthuse_WpfBridge - * Method: EnumDescendantWindowIdsFromHandle - * Signature: (J)[Ljava/lang/String; + * Method: getRuntimeIdFromHandle + * Signature: (J)Ljava/lang/String; */ -JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowIdsFromHandle(JNIEnv *env, jobject obj, jlong jwindowHandle) +JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getRuntimeIdFromHandle(JNIEnv *env, jobject obj, jlong jwindowHandle) { - array ^mchildrenIds = Global::WPF_AUTO->EnumDescendantWindowIdsFromHandle(System::IntPtr(jwindowHandle)); - - //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(mchildrenIds->Length, stringClass, 0); + System::String ^mrunId = Global::WPF_AUTO->getRuntimeIdFromHandle(System::IntPtr(jwindowHandle)); + if (mrunId == nullptr) + return NULL; marshal_context context; //lets you marshal managed classes to unmanaged types - for(int i = 0 ; i < mchildrenIds->Length ; i++) - { - env->SetObjectArrayElement(results, i, env->NewStringUTF(context.marshal_as(mchildrenIds[i]))); - } - return results; + jstring result = env->NewStringUTF(context.marshal_as(mrunId)); + return result; } /* @@ -175,7 +183,9 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string const char *properties = env->GetStringUTFChars(jproperties, 0);//convert string - array ^mwinInfo = Global::WPF_AUTO->EnumDescendantWindowInfo(marshal_as(runtimeIdValue), marshal_as(properties)); + array ^mwinInfo = Global::WPF_AUTO->enumDescendantWindowInfo(marshal_as(runtimeIdValue), marshal_as(properties)); + if (mwinInfo == nullptr) + return NULL; //create result object array to the same size as the managed window info string array jclass stringClass = env->FindClass("java/lang/String"); jobjectArray results = env->NewObjectArray(mwinInfo->Length, stringClass, 0); @@ -190,6 +200,21 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI } +/* + * Class: org_synthuse_WpfBridge + * Method: getRuntimeIdFromPoint + * Signature: (II)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getRuntimeIdFromPoint(JNIEnv *env, jobject obj, jint x, jint y) +{ + System::String ^mresult = Global::WPF_AUTO->getRuntimeIdFromPoint(x, y); + if (mresult == nullptr) + return NULL; + marshal_context context; //lets you marshal managed classes to unmanaged types + jstring result = env->NewStringUTF(context.marshal_as(mresult)); + return result; +} + /* * Class: org_synthuse_WpfBridge * Method: getParentRuntimeId @@ -199,6 +224,8 @@ JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getParentRuntimeId(JNIEnv { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string System::String ^mresult = Global::WPF_AUTO->getParentRuntimeId(marshal_as(runtimeIdValue)); + if (mresult == nullptr) + return NULL; marshal_context context; //lets you marshal managed classes to unmanaged types jstring result = env->NewStringUTF(context.marshal_as(mresult)); env->ReleaseStringUTFChars(jruntimeIdValue, runtimeIdValue); //release string @@ -215,6 +242,8 @@ JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getProperty(JNIEnv *env, j const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string const char *propertyName = env->GetStringUTFChars(jpropertyName, 0);//convert string System::String ^mresult = Global::WPF_AUTO->getProperty(marshal_as(propertyName), marshal_as(runtimeIdValue)); + if (mresult == nullptr) + return NULL; marshal_context context; //lets you marshal managed classes to unmanaged types jstring result = env->NewStringUTF(context.marshal_as(mresult)); env->ReleaseStringUTFChars(jpropertyName, propertyName); //release string @@ -232,7 +261,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_getProperties(JNIEnv { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string array ^mprops = Global::WPF_AUTO->getProperties(marshal_as(runtimeIdValue)); - + if (mprops == 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(mprops->Length, stringClass, 0); @@ -255,7 +285,8 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_getPropertiesAndValue { const char *runtimeIdValue = env->GetStringUTFChars(jruntimeIdValue, 0);//convert string array ^mprops = Global::WPF_AUTO->getPropertiesAndValues(marshal_as(runtimeIdValue)); - + if (mprops == 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(mprops->Length, stringClass, 0); diff --git a/native/WpfBridge/org_synthuse_WpfBridge.h b/native/WpfBridge/org_synthuse_WpfBridge.h index 8ecb288..6a546b9 100644 --- a/native/WpfBridge/org_synthuse_WpfBridge.h +++ b/native/WpfBridge/org_synthuse_WpfBridge.h @@ -15,6 +15,14 @@ extern "C" { JNIEXPORT void JNICALL Java_org_synthuse_WpfBridge_setFrameworkId (JNIEnv *, jobject, jstring); +/* + * Class: org_synthuse_WpfBridge + * Method: setTouchableOnly + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_org_synthuse_WpfBridge_setTouchableOnly + (JNIEnv *, jobject, jboolean); + /* * Class: org_synthuse_WpfBridge * Method: countDescendantWindows @@ -71,14 +79,6 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowIds__J (JNIEnv *, jobject, jlong); -/* - * Class: org_synthuse_WpfBridge - * Method: enumDescendantWindowIdsFromHandle - * Signature: (J)[Ljava/lang/String; - */ -JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowIdsFromHandle - (JNIEnv *, jobject, jlong); - /* * Class: org_synthuse_WpfBridge * Method: enumDescendantWindowInfo @@ -87,6 +87,22 @@ JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowI JNIEXPORT jobjectArray JNICALL Java_org_synthuse_WpfBridge_enumDescendantWindowInfo (JNIEnv *, jobject, jstring, jstring); +/* + * Class: org_synthuse_WpfBridge + * Method: getRuntimeIdFromHandle + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getRuntimeIdFromHandle + (JNIEnv *, jobject, jlong); + +/* + * Class: org_synthuse_WpfBridge + * Method: getRuntimeIdFromPoint + * Signature: (II)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_synthuse_WpfBridge_getRuntimeIdFromPoint + (JNIEnv *, jobject, jint, jint); + /* * Class: org_synthuse_WpfBridge * Method: getParentRuntimeId diff --git a/src/org/synthuse/Api.java b/src/org/synthuse/Api.java index 0cb236d..469ddb8 100644 --- a/src/org/synthuse/Api.java +++ b/src/org/synthuse/Api.java @@ -129,6 +129,7 @@ public class Api { boolean EnumChildWindows(HWND hWnd, WNDENUMPROC lpEnumFunc, Pointer data); HWND GetParent(HWND hWnd); boolean IsWindowVisible(HWND hWnd); + boolean IsWindow(HWND hWnd); int GetWindowRect(HWND hWnd, RECT r); int MapWindowPoints(HWND hWndFrom, HWND hWndTo, RECT r, int cPoints); diff --git a/src/org/synthuse/Config.java b/src/org/synthuse/Config.java index d5afe05..8440901 100644 --- a/src/org/synthuse/Config.java +++ b/src/org/synthuse/Config.java @@ -25,4 +25,9 @@ public class Config extends PropertiesSerializer { super(propertyFilename); load(propertyFilename); } + + public boolean isWpfBridgeDisabled() + { + return disableWpf.equals("true") || disableWpf.equals("True"); + } } diff --git a/src/org/synthuse/SynthuseDlg.java b/src/org/synthuse/SynthuseDlg.java index 5249d47..5f9e1e1 100644 --- a/src/org/synthuse/SynthuseDlg.java +++ b/src/org/synthuse/SynthuseDlg.java @@ -95,12 +95,14 @@ public class SynthuseDlg extends JFrame { public static Config config = new Config(Config.DEFAULT_PROP_FILENAME); private String dialogResult = ""; private String lastDragHwnd = ""; + private String lastRuntimeId =""; private JComboBox cmbXpath; private JButton btnTestIde; private TestIdeFrame testIde = null; private int targetX; private int targetY; + private WpfBridge wpf = new WpfBridge(); /** * Launch the application. @@ -423,16 +425,17 @@ public class SynthuseDlg extends JFrame { String handleStr = Api.GetHandleAsString(hwnd); String classStr = WindowsEnumeratedXml.escapeXmlAttributeValue(Api.GetWindowClassName(hwnd)); String parentStr = Api.GetHandleAsString(User32.instance.GetParent(hwnd)); - - lblStatus.setText("class: " + classStr + " hWnd: " + handleStr + " parent: " + parentStr + " X,Y: " + targetX + ", " + targetY); - if (!lastDragHwnd.equals(handleStr)) { + String runtimeId = wpf.getRuntimeIdFromPoint(targetX, targetY); + lblStatus.setText("rid:" + runtimeId + " class: " + classStr + " hWnd: " + handleStr + " parent: " + parentStr + " X,Y: " + targetX + ", " + targetY); + if (!lastDragHwnd.equals(handleStr) || !lastRuntimeId.equals(runtimeId)) { if (!lastDragHwnd.isEmpty()) { Api.refreshWindow(Api.GetHandleFromString(lastDragHwnd)); } lastDragHwnd = handleStr; + lastRuntimeId = runtimeId; //lastDragHwnd = (hwnd + ""); Api.highlightWindow(hwnd); - XpathManager.buildXpathStatementThreaded(hwnd, textPane, xpathEvents); + XpathManager.buildXpathStatementThreaded(hwnd, runtimeId, textPane, xpathEvents); } } } diff --git a/src/org/synthuse/WinPtr.java b/src/org/synthuse/WinPtr.java new file mode 100644 index 0000000..03fe5d2 --- /dev/null +++ b/src/org/synthuse/WinPtr.java @@ -0,0 +1,52 @@ +package org.synthuse; + +import com.sun.jna.platform.win32.WinDef.HWND; + +public class WinPtr { + + public HWND hWnd = null; + public String hWndStr = ""; + public String runtimeId = ""; + + public WinPtr() { + } + + public WinPtr(HWND hWnd) { + this.hWnd = hWnd; + this.hWndStr = Api.GetHandleAsString(hWnd); + } + + public WinPtr(String runtimeId) { + this.runtimeId = runtimeId; + } + + public boolean isWin32() { + return (hWnd != null || !hWndStr.equals("")); + } + + public boolean isWpf() { + return (!runtimeId.equals("")); + } + + public boolean isEmpty() { + return (hWnd == null && hWndStr.equals("") && runtimeId.equals("")); + } + + public static boolean isWpfRuntimeIdFormat(String runtimeIdTest) { + return (runtimeIdTest.contains("-")); + } + + public String toString() { + if (isWin32() && !hWndStr.equals("")) + return hWndStr; + else if (isWin32() && hWnd != null) + { + hWndStr = Api.GetHandleAsString(hWnd); + return hWndStr; + } + else if (isWpf()) + return runtimeId; + else + return null; + } +} diff --git a/src/org/synthuse/WindowsEnumeratedXml.java b/src/org/synthuse/WindowsEnumeratedXml.java index 4973a91..647f8be 100644 --- a/src/org/synthuse/WindowsEnumeratedXml.java +++ b/src/org/synthuse/WindowsEnumeratedXml.java @@ -12,7 +12,6 @@ import java.io.StringWriter; import java.sql.Timestamp; import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; @@ -74,11 +73,16 @@ public class WindowsEnumeratedXml implements Runnable{ public static String getXml() { final Map infoList = new LinkedHashMap(); final Map processList = new LinkedHashMap(); + final Map wpfParentList = new LinkedHashMap(); + int wpfCount = 0; class ChildWindowCallback implements WinUser.WNDENUMPROC { @Override public boolean callback(HWND hWnd, Pointer lParam) { - infoList.put(Api.GetHandleAsString(hWnd), new WindowInfo(hWnd, true)); + WindowInfo wi = new WindowInfo(hWnd, true); + infoList.put(wi.hwndStr, wi); + if (wi.className.startsWith("HwndWrapper")) + wpfParentList.put(wi.hwndStr, null); return true; } } @@ -86,7 +90,10 @@ public class WindowsEnumeratedXml implements Runnable{ class ParentWindowCallback implements WinUser.WNDENUMPROC { @Override public boolean callback(HWND hWnd, Pointer lParam) { - infoList.put(Api.GetHandleAsString(hWnd), new WindowInfo(hWnd, false)); + WindowInfo wi = new WindowInfo(hWnd, false); + infoList.put(wi.hwndStr, wi); + if (wi.className.startsWith("HwndWrapper")) + wpfParentList.put(wi.hwndStr, null); Api.User32.instance.EnumChildWindows(hWnd, new ChildWindowCallback(), new Pointer(0)); return true; } @@ -94,8 +101,19 @@ public class WindowsEnumeratedXml implements Runnable{ Api.User32.instance.EnumWindows(new ParentWindowCallback(), 0); //Enumerate WPF windows and add to list - if (!SynthuseDlg.config.disableWpf.equals("true")) - infoList.putAll(EnumerateWindowsWithWpfBridge("WPF")); + if (!SynthuseDlg.config.isWpfBridgeDisabled()) + { + ////win[starts-with(@class,'HwndWrapper')] + //WpfBridge wb = new WpfBridge(); + //if (wb.countDescendantWindows() > 0) + for (String handle : wpfParentList.keySet()) { + //WindowInfo w = wpfParentList.get(handle); + //System.out.println("EnumerateWindowsWithWpfBridge: " + handle); + Map wpfInfoList = EnumerateWindowsWithWpfBridge(handle, "WPF"); + wpfCount += wpfInfoList.size(); + infoList.putAll(wpfInfoList); + } + } // convert window info list to xml dom try { @@ -159,6 +177,8 @@ public class WindowsEnumeratedXml implements Runnable{ totals.setAttribute("parentCount", parentCount+""); totals.setAttribute("childCount", childCount+""); totals.setAttribute("windowCount", infoList.size()+""); + totals.setAttribute("wpfWrapperCount", wpfParentList.size()+""); + totals.setAttribute("wpfCount", wpfCount+""); totals.setAttribute("processCount", processList.size()+""); totals.setAttribute("updatedLast", new Timestamp((new Date()).getTime()) + ""); rootElement.appendChild(totals); @@ -172,24 +192,26 @@ public class WindowsEnumeratedXml implements Runnable{ return ""; } - public static Map EnumerateWindowsWithWpfBridge(String frameworkType) { + public static Map EnumerateWindowsWithWpfBridge(String parentHwndStr, String frameworkType) { final Map infoList = new LinkedHashMap(); WpfBridge wb = new WpfBridge(); wb.setFrameworkId(frameworkType); - List parentIds = new ArrayList(Arrays.asList(wb.enumChildrenWindowIds(""))); - //System.out.println("enumChildrenWindowIds"); - String[] allIds = wb.enumDescendantWindowInfo("", WindowInfo.WPF_PROPERTY_LIST); + long hwnd = Long.parseLong(parentHwndStr); + //List parentIds = new ArrayList(Arrays.asList(wb.enumChildrenWindowIds(""))); + //System.out.println("getRuntimeIdFromHandle"); + String parentRuntimeId = wb.getRuntimeIdFromHandle(hwnd); + //System.out.println("runtimeId=" + runtimeId); + String[] allIds = wb.enumDescendantWindowInfo(parentRuntimeId, WindowInfo.WPF_PROPERTY_LIST); + if (allIds == null) + return infoList; //empty list //System.out.println("enumDescendantWindowIds " + allIds.length); for(String runtimeIdAndInfo : allIds) { //System.out.println("getting window info for: " + runtimeIdAndInfo); - String onlyRuntimeId = runtimeIdAndInfo; - if (runtimeIdAndInfo.contains(",")) - onlyRuntimeId = runtimeIdAndInfo.substring(0, runtimeIdAndInfo.indexOf(",")); + WindowInfo wi = new WindowInfo(runtimeIdAndInfo, true); + if (wi.parentStr.equals(parentRuntimeId)) + wi.parentStr = parentHwndStr; //System.out.println("is parent? " + onlyRuntimeId); - if (parentIds.contains(onlyRuntimeId)) //is Parent? - infoList.put(onlyRuntimeId, new WindowInfo(runtimeIdAndInfo, false)); - else// must be child - infoList.put(onlyRuntimeId, new WindowInfo(runtimeIdAndInfo, true)); + infoList.put(wi.runtimeId, wi); } return infoList; } diff --git a/src/org/synthuse/WpfBridge.java b/src/org/synthuse/WpfBridge.java index 769e236..c76cf1c 100644 --- a/src/org/synthuse/WpfBridge.java +++ b/src/org/synthuse/WpfBridge.java @@ -7,6 +7,7 @@ package org.synthuse; +import java.awt.Point; import java.io.*; public class WpfBridge { @@ -69,24 +70,57 @@ public class WpfBridge { System.load(temp.getAbsolutePath()); } - native void setFrameworkId(String propertyValue); //default is WPF, but also accepts Silverlight, Win32 + public native void setFrameworkId(String propertyValue); //default is WPF, but also accepts Silverlight, Win32 + public native void setTouchableOnly(boolean val); //default is true //Descendants will walk the full tree of windows, NOT just one level of children - native int countDescendantWindows(); - native int countDescendantWindows(String runtimeIdValue); + public native int countDescendantWindows(); + public native int countDescendantWindows(String runtimeIdValue); - native int countChildrenWindows(); - native int countChildrenWindows(String runtimeIdValue); + public native int countChildrenWindows(); + public native int countChildrenWindows(String runtimeIdValue); - native String[] enumChildrenWindowIds(String runtimeIdValue); //if runtimeIdValue is null will start at desktop - native String[] enumDescendantWindowIds(String runtimeIdValue); //if runtimeIdValue is null will start at desktop - native String[] enumDescendantWindowIds(long processId); - native String[] enumDescendantWindowIdsFromHandle(long windowHandle); + public native String[] enumChildrenWindowIds(String runtimeIdValue); //if runtimeIdValue is null will start at desktop + public native String[] enumDescendantWindowIds(String runtimeIdValue); //if runtimeIdValue is null will start at desktop + public native String[] enumDescendantWindowIds(long processId); //In all the above Enumerate methods will return a list of Runtime Ids for all related windows. - native String[] enumDescendantWindowInfo(String runtimeIdValue, String properties); //returns properties comma separated + public native String[] enumDescendantWindowInfo(String runtimeIdValue, String properties); //returns properties comma separated - native String getParentRuntimeId(String runtimeIdValue); - native String getProperty(String propertyName, String runtimeIdValue); - native String[] getProperties(String runtimeIdValue); - native String[] getPropertiesAndValues(String runtimeIdValue); + public native String getRuntimeIdFromHandle(long windowHandle); + public native String getRuntimeIdFromPoint(int x, int y); + public native String getParentRuntimeId(String runtimeIdValue); + public native String getProperty(String propertyName, String runtimeIdValue); + public native String[] getProperties(String runtimeIdValue); + public native String[] getPropertiesAndValues(String runtimeIdValue); + + public Point getCenterOfElement(String runtimeIdValue) { + Point p = new Point(); + String boundary = getProperty("BoundingRectangleProperty", runtimeIdValue); + //System.out.println("boundary: " + boundary); //boundary: 841,264,125,29 + String[] boundarySplt = boundary.split(","); + int x = Integer.parseInt(boundarySplt[0]); + int y = Integer.parseInt(boundarySplt[1]); + int width = Integer.parseInt(boundarySplt[2]); + int height = Integer.parseInt(boundarySplt[3]); + p.x = ((width) /2) + x; + p.y = ((height) /2) + y; + return p; + } + + public String getWindowClass(String runtimeIdValue) { + return getProperty("ClassNameProperty", runtimeIdValue); + } + + public String getWindowText(String runtimeIdValue) { + return getProperty("NameProperty", runtimeIdValue); + } + + public String getWindowAutomationId(String runtimeIdValue) { + return getProperty("AutomationIdProperty", runtimeIdValue); + } + + public String getWindowFramework(String runtimeIdValue) { + return getProperty("FrameworkIdProperty", runtimeIdValue); + } + } diff --git a/src/org/synthuse/XpathManager.java b/src/org/synthuse/XpathManager.java index 330d61e..2c11563 100644 --- a/src/org/synthuse/XpathManager.java +++ b/src/org/synthuse/XpathManager.java @@ -21,7 +21,9 @@ import com.sun.jna.platform.win32.WinDef.HWND; public class XpathManager implements Runnable{ private HWND hwnd = null; + private String runtimeId = null; private JTextPane windowsXmlTextPane = null; + private WpfBridge wpf = null; public static interface Events { void statusChanged(String status); @@ -42,6 +44,14 @@ public class XpathManager implements Runnable{ this.windowsXmlTextPane = windowsXmlTextPane; } + public XpathManager(HWND hwnd, String runtimeId, JTextPane windowsXmlTextPane, Events events) { + this.events = events; + this.hwnd = hwnd; + this.runtimeId = runtimeId; + this.windowsXmlTextPane = windowsXmlTextPane; + this.wpf = new WpfBridge(); + } + @Override public void run() { String results = buildXpathStatement(); @@ -53,14 +63,56 @@ public class XpathManager implements Runnable{ t.start(); } + public static void buildXpathStatementThreaded(HWND hwnd, String runtimeId, JTextPane windowsXmlTextPane, Events events) { + Thread t = new Thread(new XpathManager(hwnd, runtimeId, windowsXmlTextPane, events)); + t.start(); + } + + public String compareLongTextString(String rawText) { + String escapedTxtStr = WindowsEnumeratedXml.escapeXmlAttributeValue(rawText); + if (!escapedTxtStr.isEmpty()) { + if (rawText.length() > 20) {// if the raw text is too long only test the first 20 characters + escapedTxtStr = WindowsEnumeratedXml.escapeXmlAttributeValue(rawText.substring(0, 20)); + } + } + return escapedTxtStr; + } + + public String buildWpfXpathStatement() { + String builtXpath = ""; + String xml = this.windowsXmlTextPane.getText(); + String classStr = wpf.getWindowClass(runtimeId); + //System.out.println("class: " + classStr); + String txtOrig = wpf.getWindowText(runtimeId); + if (classStr == null || txtOrig == null) + return ""; + //System.out.println("text: " + txtOrig); + String txtStr = compareLongTextString(txtOrig); + builtXpath = "//wpf[@class='" + classStr + "' and starts-with(@text,'" + txtStr + "')]"; + //builtXpath = "//*[@hwnd='" + runtimeId + "']"; + System.out.println("evaluateXpathGetValues: " + builtXpath); + List wpfResultList = WindowsEnumeratedXml.evaluateXpathGetValues(xml, builtXpath); + if (wpfResultList.size() == 0) + return ""; + // return builtXpath; + return builtXpath; + } + public String buildXpathStatement() { String builtXpath = ""; try { + String xml = this.windowsXmlTextPane.getText(); + if (runtimeId != null && !SynthuseDlg.config.isWpfBridgeDisabled()) { + if (!runtimeId.isEmpty()) { + builtXpath = buildWpfXpathStatement(); + } + } + if (builtXpath != "") + return builtXpath; String classStr = WindowsEnumeratedXml.escapeXmlAttributeValue(Api.GetWindowClassName(hwnd)); String handleStr = Api.GetHandleAsString(hwnd); String txtOrig = Api.GetWindowText(hwnd); String txtStr = WindowsEnumeratedXml.escapeXmlAttributeValue(txtOrig); - String xml = this.windowsXmlTextPane.getText(); builtXpath = "//win[@class='" + classStr + "']"; List resultList = WindowsEnumeratedXml.evaluateXpathGetValues(xml, builtXpath); //int matches = nextXpathMatch(builtXpath, textPane, true); diff --git a/src/org/synthuse/commands/BaseCommand.java b/src/org/synthuse/commands/BaseCommand.java index ae81354..9d74682 100644 --- a/src/org/synthuse/commands/BaseCommand.java +++ b/src/org/synthuse/commands/BaseCommand.java @@ -1,6 +1,7 @@ package org.synthuse.commands; +import java.awt.Point; import java.io.PrintWriter; import java.io.StringWriter; import java.sql.Timestamp; @@ -9,14 +10,13 @@ import java.util.List; import org.synthuse.*; -import com.sun.jna.platform.win32.WinDef.HWND; - public class BaseCommand { static String WIN_XML = ""; static long LAST_UPDATED_XML = 0; protected Api api = new Api(); + protected WpfBridge wpf = new WpfBridge(); protected CommandProcessor parentProcessor = null; protected int getExecuteErrorCount() { @@ -92,12 +92,12 @@ public class BaseCommand { return cmdResult; } - public HWND findHandleWithXpath(String xpath) { + public WinPtr findHandleWithXpath(String xpath) { return findHandleWithXpath(xpath, false); } - public HWND findHandleWithXpath(String xpath, boolean ignoreFailedFind) { - HWND result = null; + public WinPtr findHandleWithXpath(String xpath, boolean ignoreFailedFind) { + WinPtr result = new WinPtr(); double secondsFromLastUpdate = ((double)(System.nanoTime() - LAST_UPDATED_XML) / 1000000000); if (secondsFromLastUpdate > CommandProcessor.XML_UPDATE_THRESHOLD) { //default 5 second threshold WIN_XML = WindowsEnumeratedXml.getXml(); @@ -109,18 +109,34 @@ public class BaseCommand { for(String item: resultList) { if (item.contains("hwnd=")) { List hwndList = WindowsEnumeratedXml.evaluateXpathGetValues(item, "//@hwnd"); - resultStr = hwndList.get(0); + if (hwndList.size() > 0) + resultStr = hwndList.get(0); //get first hwnd; } else resultStr = item; break; } - result = Api.GetHandleFromString(resultStr); - if (result == null && !ignoreFailedFind) + if (WinPtr.isWpfRuntimeIdFormat(resultStr)) + result.runtimeId = resultStr; + else { + result.hWnd = Api.GetHandleFromString(resultStr); + if (!api.user32.IsWindow(result.hWnd)) + appendError("Error: Failed to located HWND(" + resultStr + ") from : " + xpath); + } + if (result.isEmpty()) appendError("Error: Failed to find window handle matching: " + xpath); return result; } + public Point getCenterWindowPosition(WinPtr handle) { + Point p = null; + if (handle.isWin32()) + p = api.getWindowPosition(handle.hWnd); + else + p = wpf.getCenterOfElement(handle.runtimeId); + return p; + } + public String convertListToString(List listStr, String delimiter) { StringBuilder result = new StringBuilder(""); for (String item: listStr) { diff --git a/src/org/synthuse/commands/MainCommands.java b/src/org/synthuse/commands/MainCommands.java index db042b2..4570c26 100644 --- a/src/org/synthuse/commands/MainCommands.java +++ b/src/org/synthuse/commands/MainCommands.java @@ -5,7 +5,6 @@ import java.awt.Toolkit; import java.io.IOException; import org.synthuse.*; -import com.sun.jna.platform.win32.WinDef.HWND; public class MainCommands extends BaseCommand { @@ -55,12 +54,12 @@ public class MainCommands extends BaseCommand { long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000)); long attemptCount = 0; String xpath = "/EnumeratedWindows/win[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']"; - HWND handle = findHandleWithXpath(xpath, true); - if (handle != null)// first test without a timeout + WinPtr handle = findHandleWithXpath(xpath, true); + if (!handle.isEmpty())// first test without a timeout return true; while (attemptCount < totalAttempts) { handle = findHandleWithXpath(xpath, true); - if (handle != null) + if (!handle.isEmpty()) break; try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();} ++attemptCount; @@ -76,12 +75,12 @@ public class MainCommands extends BaseCommand { long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000)); long attemptCount = 0; String xpath = "//[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']"; - HWND handle = findHandleWithXpath(xpath, true); - if (handle != null)// first test without a timeout + WinPtr handle = findHandleWithXpath(xpath, true); + if (!handle.isEmpty())// first test without a timeout return true; while (attemptCount < totalAttempts) { handle = findHandleWithXpath(xpath, true); - if (handle != null) + if (!handle.isEmpty()) break; try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();} ++attemptCount; @@ -97,12 +96,12 @@ public class MainCommands extends BaseCommand { long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000)); long attemptCount = 0; String xpath = "//win[@CLASS='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']"; - HWND handle = findHandleWithXpath(xpath, true); - if (handle != null)// first test without a timeout + WinPtr handle = findHandleWithXpath(xpath, true); + if (!handle.isEmpty())// first test without a timeout return true; while (attemptCount < totalAttempts) { handle = findHandleWithXpath(xpath, true); - if (handle != null) + if (!handle.isEmpty()) break; try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();} ++attemptCount; @@ -117,12 +116,12 @@ public class MainCommands extends BaseCommand { return false; long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000)); long attemptCount = 0; - HWND handle = findHandleWithXpath(args[0], true); - if (handle != null)// first test without a timeout + WinPtr handle = findHandleWithXpath(args[0], true); + if (!handle.isEmpty())// first test without a timeout return true; while (attemptCount < totalAttempts) { handle = findHandleWithXpath(args[0], true); - if (handle != null) + if (!handle.isEmpty()) break; try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();} ++attemptCount; diff --git a/src/org/synthuse/commands/MouseCommands.java b/src/org/synthuse/commands/MouseCommands.java index 231f80f..c4f8ce7 100644 --- a/src/org/synthuse/commands/MouseCommands.java +++ b/src/org/synthuse/commands/MouseCommands.java @@ -4,8 +4,6 @@ import java.awt.Point; import org.synthuse.*; -import com.sun.jna.platform.win32.WinDef.HWND; - public class MouseCommands extends BaseCommand { public MouseCommands(CommandProcessor commandProcessor) { @@ -15,10 +13,12 @@ public class MouseCommands extends BaseCommand { public boolean cmdClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + //System.out.println("cmdClick1: " + args[0]); + if (handle.isEmpty()) return false; - Point p = api.getWindowPosition(handle); + Point p = getCenterWindowPosition(handle); + //System.out.println("cmdClick3: " + p.x + "," + p.y); RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y); RobotMacro.leftClickMouse(); return true; @@ -27,10 +27,10 @@ public class MouseCommands extends BaseCommand { public boolean cmdDoubleClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - Point p = api.getWindowPosition(handle); + Point p = getCenterWindowPosition(handle); RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y); RobotMacro.doubleClickMouse(); return true; @@ -39,10 +39,10 @@ public class MouseCommands extends BaseCommand { public boolean cmdRightClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - Point p = api.getWindowPosition(handle); + Point p = getCenterWindowPosition(handle); RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y); RobotMacro.rightClickMouse(); return true; @@ -71,10 +71,10 @@ public class MouseCommands extends BaseCommand { public boolean cmdMouseMove(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - Point p = api.getWindowPosition(handle); + Point p = getCenterWindowPosition(handle); RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y); //System.out.println("point " + p.x + "," + p.y); return true; @@ -101,30 +101,30 @@ public class MouseCommands extends BaseCommand { public boolean cmdWinClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.sendClick(handle); + api.sendClick(handle.hWnd); return true; } public boolean cmdWinDoubleClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.sendDoubleClick(handle); + api.sendDoubleClick(handle.hWnd); return true; } public boolean cmdWinRightClick(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.sendRightClick(handle); + api.sendRightClick(handle.hWnd); return true; } } diff --git a/src/org/synthuse/commands/WindowsCommands.java b/src/org/synthuse/commands/WindowsCommands.java index 6526bf1..5be8327 100644 --- a/src/org/synthuse/commands/WindowsCommands.java +++ b/src/org/synthuse/commands/WindowsCommands.java @@ -2,8 +2,6 @@ package org.synthuse.commands; import org.synthuse.*; -import com.sun.jna.platform.win32.WinDef.HWND; - public class WindowsCommands extends BaseCommand { public WindowsCommands(CommandProcessor cp) { @@ -13,10 +11,10 @@ public class WindowsCommands extends BaseCommand { public boolean cmdWindowFocus(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.activateWindow(handle); + api.activateWindow(handle.hWnd); //api.showWindow(handle); return true; } @@ -24,60 +22,60 @@ public class WindowsCommands extends BaseCommand { public boolean cmdWindowMinimize(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.minimizeWindow(handle); + api.minimizeWindow(handle.hWnd); return true; } public boolean cmdWindowMaximize(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.maximizeWindow(handle); + api.maximizeWindow(handle.hWnd); return true; } public boolean cmdWindowRestore(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.restoreWindow(handle); + api.restoreWindow(handle.hWnd); return true; } public boolean cmdWindowHide(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.hideWindow(handle); + api.hideWindow(handle.hWnd); return true; } public boolean cmdWindowShow(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.showWindow(handle); + api.showWindow(handle.hWnd); return true; } public boolean cmdWindowSwitchToThis(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.switchToThisWindow(handle, true); + api.switchToThisWindow(handle.hWnd, true); return true; } @@ -85,29 +83,29 @@ public class WindowsCommands extends BaseCommand { public boolean cmdWindowClose(String[] args) { if (!checkArgumentLength(args, 1)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.closeWindow(handle); + api.closeWindow(handle.hWnd); return true; } public boolean cmdSetText(String[] args) { if (!checkArgumentLength(args, 2)) return false; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return false; - api.sendWmSetText(handle, args[1]); + api.sendWmSetText(handle.hWnd, args[1]); return true; } public String cmdGetText(String[] args) { if (!checkArgumentLength(args, 1)) return ""; - HWND handle = findHandleWithXpath(args[0]); - if (handle == null) + WinPtr handle = findHandleWithXpath(args[0]); + if (handle.isEmpty()) return ""; - return api.sendWmGetText(handle); + return api.sendWmGetText(handle.hWnd); } } diff --git a/src/org/synthuse/test/WpfBridgeTest.java b/src/org/synthuse/test/WpfBridgeTest.java new file mode 100644 index 0000000..317da61 --- /dev/null +++ b/src/org/synthuse/test/WpfBridgeTest.java @@ -0,0 +1,59 @@ +package org.synthuse.test; +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.synthuse.*; + +public class WpfBridgeTest { + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void countChildren() { + WpfBridge wb = new WpfBridge(); + wb.setFrameworkId("Win32");//We should find some Win32 windows, maybe not WPF + int win32Cnt = wb.countChildrenWindows(); + assertTrue(win32Cnt > 0); + System.out.println("win32 countChildrenWindows: " + win32Cnt); + wb.setFrameworkId("WPF");// maybe not WPF + //System.out.println("wpf countChildrenWindows: " + wb.countChildrenWindows()); + } + + @Test + public void getRuntimeFromHandle() { + long handle = 1639790; + //String rid = wb.getRuntimeIdFromHandle(handle); + //System.out.println("getRuntimeIdFromHandle: " + rid); + handle = 984416; + //rid = wb.getRuntimeIdFromHandle(handle); + //System.out.println("getRuntimeIdFromHandle: " + rid); + } + + @Test + public void enumerateWindowInfo() { + WpfBridge wb = new WpfBridge(); + /* + EnumerateWindowsWithWpfBridge: 1639790 + getRuntimeIdFromHandle + runtimeId=42-1639790 + enumDescendantWindowIds 18 + EnumerateWindowsWithWpfBridge: 984416 + getRuntimeIdFromHandle + runtimeId=42-984416 + */ + //int count = wb.countDescendantWindows("42-984416"); + String[] wInfo = wb.enumDescendantWindowInfo("42-984416", WindowInfo.WPF_PROPERTY_LIST); + if (wInfo != null) + System.out.println("enumDescendantWindowInfo: " + wInfo.length); + } +}