From 4258d0977fe032f71cbc0d815f8cee033df17ee7 Mon Sep 17 00:00:00 2001 From: Edward Jakubowski Date: Fri, 2 May 2014 22:01:43 -0400 Subject: [PATCH] Added SelectContextMenuId Command, increasing uiabridge speeds, reliability --- native/uiabridge/bin/uiabridge32.dll | Bin 77312 -> 77824 bytes native/uiabridge/bin/uiabridge64.dll | Bin 91136 -> 91648 bytes native/uiabridge/org_synthuse_UiaBridge.cpp | 3 +- native/uiabridge/uiabridge.cpp | 62 +++++++++++------- native/uiabridge/uiabridge.h | 6 +- native/uiabtest/Release/uiabridge.dll | Bin 0 -> 77824 bytes native/uiabtest/Release/uiabtest.exe | Bin 0 -> 52224 bytes native/uiabtest/uiabtest.cpp | 54 ++++++++++++--- src/org/synthuse/Api.java | 16 ++++- src/org/synthuse/CommandPopupMenu.java | 3 + src/org/synthuse/CommandProcessor.java | 2 + src/org/synthuse/KeyboardHook.java | 3 +- src/org/synthuse/MenuInfo.java | 17 ++++- src/org/synthuse/RobotMacro.java | 2 +- src/org/synthuse/SynthuseDlg.java | 2 +- src/org/synthuse/UiaBridge.java | 7 +- src/org/synthuse/WindowInfo.java | 49 +++++++++----- src/org/synthuse/WindowsEnumeratedXml.java | 8 ++- .../synthuse/commands/WindowsCommands.java | 16 +++++ 19 files changed, 185 insertions(+), 65 deletions(-) create mode 100644 native/uiabtest/Release/uiabridge.dll create mode 100644 native/uiabtest/Release/uiabtest.exe diff --git a/native/uiabridge/bin/uiabridge32.dll b/native/uiabridge/bin/uiabridge32.dll index 031f5f746cca6929722795b51cdb85497fbe3090..7969ec0bc3eeb178c79c78df5af78eb5169e2886 100644 GIT binary patch delta 25809 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 delta 25487 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 diff --git a/native/uiabridge/bin/uiabridge64.dll b/native/uiabridge/bin/uiabridge64.dll index 739108b6facf011b84e86a49a511a400c8b1848a..ce2c6751b65fc2d38b0cf839ef2e28c75b77986a 100644 GIT binary patch delta 26451 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, 0);//convert string + Global::AUTO_BRIDGE = gcnew AutomationBridge(marshal_as(properties)); } /* diff --git a/native/uiabridge/uiabridge.cpp b/native/uiabridge/uiabridge.cpp index 158ef1a..d6dfeff 100644 --- a/native/uiabridge/uiabridge.cpp +++ b/native/uiabridge/uiabridge.cpp @@ -18,7 +18,14 @@ AutomationBridge::AutomationBridge() { enumFilters = gcnew Dictionary(); cacheRequest = nullptr; - initializeCache(); + initializeCache(""); +} + +AutomationBridge::AutomationBridge(System::String ^cachedProperties) +{ + enumFilters = gcnew Dictionary(); + cacheRequest = nullptr; + initializeCache(cachedProperties); } AutomationBridge::~AutomationBridge() @@ -29,7 +36,7 @@ AutomationBridge::~AutomationBridge() //Console::WriteLine("disposing of AutomationBridge"); } -void AutomationBridge::initializeCache() +void AutomationBridge::initializeCache(System::String ^cachedProperties) { cacheRequest = gcnew CacheRequest(); //cacheRequest->AutomationElementMode = AutomationElementMode::Full; @@ -45,7 +52,11 @@ void AutomationBridge::initializeCache() cacheRequest->Add(AutomationElement::NameProperty); cacheRequest->Add(AutomationElement::BoundingRectangleProperty); */ - System::String ^cachedPropStr = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ControlTypeProperty,ClassNameProperty,NameProperty,BoundingRectangleProperty,ValueProperty"; + System::String ^cachedPropStr = cachedProperties; + if (cachedPropStr == nullptr) // check if blank/null we need to use DEFAULT_CACHED_PROPS; + cachedPropStr = DEFAULT_CACHED_PROPS; + else if (cachedPropStr->Equals("")) + cachedPropStr = DEFAULT_CACHED_PROPS; array ^rootProperties = AutomationElement::RootElement->GetSupportedProperties(); List ^cacheList = gcnew List(); if (cachedPropStr->Contains(L"NativeWindowHandleProperty")) //special property not in the root property list @@ -244,7 +255,7 @@ array ^ AutomationBridge::enumWindowInfo(System::IntPtr window AutomationElement ^element = AutomationElement::FromHandle(windowHandle); List ^winInfoList = gcnew List(); if (!isElementFiltered(element)) //test parent should be filtered - winInfoList->Add(getWindowInfo(element, properties)); + winInfoList->Add(getWindowInfo(element, properties, nullptr)); winInfoList->AddRange(enumWindowInfo(element, properties)); return winInfoList->ToArray(); } @@ -255,25 +266,16 @@ array ^ AutomationBridge::enumWindowInfo(AutomationElement ^el return enumWindowInfo(element, properties, filterModifierList); } -array ^ AutomationBridge::enumWindowInfo(AutomationElement ^element, System::String ^properties, List ^filterModifierList) +array ^ AutomationBridge::enumWindowInfo(AutomationElement ^parentElement, System::String ^properties, List ^filterModifierList) { List ^winInfoList = gcnew List(); - if (element == nullptr) + if (parentElement == 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); - } + currentElement = tw->GetFirstChild(parentElement, cacheRequest); if (currentElement == nullptr) { //System::Console::WriteLine("no children {0}", element->CachedChildren->Count); @@ -292,7 +294,7 @@ array ^ AutomationBridge::enumWindowInfo(AutomationElement ^el Boolean modifierChanged = fmlOriginalSize != filterModifierList->Count; if (!filtered) //not filtered so return element { - winInfoList->Add(getWindowInfo(currentElement, properties)); + winInfoList->Add(getWindowInfo(currentElement, properties, parentElement)); winInfoList->AddRange(enumWindowInfo(currentElement, properties, filterModifierList)); } else //filtered, but if modifier used keep searching children @@ -303,16 +305,16 @@ array ^ AutomationBridge::enumWindowInfo(AutomationElement ^el 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); } + currentElement = tw->GetNextSibling(currentElement, cacheRequest); } return winInfoList->ToArray(); } -System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, System::String ^properties) +System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, System::String ^properties, AutomationElement ^optionalParentElement) { System::String ^resultProperties = L""; System::String ^propertyNameErrorCheck = L""; @@ -323,16 +325,28 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys if (properties->Equals(L"*")) wildcardEnabled = true; + //setup parentElement + System::String ^parentRuntimeId = L""; + if (wildcardEnabled || properties->Contains(L"ParentRuntimeIdProperty")) + { + if (optionalParentElement == nullptr) + { + TreeWalker ^tw = TreeWalker::ControlViewWalker; + parentRuntimeId = getRuntimeIdFromElement(tw->GetParent(element, cacheRequest)); + } + else + parentRuntimeId = getRuntimeIdFromElement(optionalParentElement); + } + //create array for keeping order of properties System::String ^delim = L","; array ^propSpltArray = properties->Split(delim->ToCharArray()); - TreeWalker ^tw = TreeWalker::ControlViewWalker; System::Int32 count = 0; array ^aps = cachedRootProperties;//element->GetSupportedProperties(); array ^propValues = gcnew array(propSpltArray->Length);//keep order System::String ^wildcardProperties = L""; if (wildcardEnabled) { - wildcardProperties += "ParentRuntimeIdProperty:" + getRuntimeIdFromElement(tw->GetParent(element, cacheRequest)) + ","; + wildcardProperties += "ParentRuntimeIdProperty:" + parentRuntimeId + ","; //propValues = gcnew array(aps->Length +1 );//add one for parent property since it doesn't exist } for(int i=0 ; i < propValues->Length ; i++) @@ -340,7 +354,7 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys propValues[i] = L""; if (propSpltArray[i]->Equals("ParentRuntimeIdProperty"))//custom property for getting parent { - propValues[i] = getRuntimeIdFromElement(tw->GetParent(element, cacheRequest)); + propValues[i] = parentRuntimeId; } } for each(AutomationProperty ^ap in aps) //loop through all supported Properties for a child @@ -404,13 +418,13 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys 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); + return getWindowInfo(element, properties, nullptr); } System::String ^ AutomationBridge::getWindowInfo(System::IntPtr windowHandle, System::String ^properties) { AutomationElement ^element = AutomationElement::FromHandle(windowHandle); - return getWindowInfo(element, properties); + return getWindowInfo(element, properties, nullptr); } System::String ^ AutomationBridge::getWindowInfo(System::String ^runtimeIdStr, System::String ^properties) diff --git a/native/uiabridge/uiabridge.h b/native/uiabridge/uiabridge.h index 16cd3aa..30c8103 100644 --- a/native/uiabridge/uiabridge.h +++ b/native/uiabridge/uiabridge.h @@ -18,6 +18,7 @@ namespace uiabridge { { public: AutomationBridge(void); + AutomationBridge(System::String ^cachedProperties); ~AutomationBridge(); int addEnumFilter(System::String ^propertyName, System::String ^propertyValue); void clearEnumFilters(); @@ -28,7 +29,7 @@ namespace uiabridge { array ^ enumWindowInfo(System::IntPtr windowHandle, System::String ^properties); array ^ enumWindowInfo(AutomationElement ^element, System::String ^properties); array ^ enumWindowInfo(AutomationElement ^element, System::String ^properties, List ^filterModifierList); - System::String ^ getWindowInfo(AutomationElement ^element, System::String ^properties); + System::String ^ getWindowInfo(AutomationElement ^element, System::String ^properties, AutomationElement ^optionalParentElement); 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); @@ -36,8 +37,9 @@ namespace uiabridge { 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 + static System::String ^DEFAULT_CACHED_PROPS = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ControlTypeProperty,ClassNameProperty,NameProperty,BoundingRectangleProperty,ValueProperty"; private: - void initializeCache(); + void initializeCache(System::String ^cachedProperties); Dictionary ^enumFilters; void AutomationBridge::processFilterModifier(Boolean filtered, Boolean modifierChanged, List ^filterModifierList); CacheRequest ^cacheRequest; diff --git a/native/uiabtest/Release/uiabridge.dll b/native/uiabtest/Release/uiabridge.dll new file mode 100644 index 0000000000000000000000000000000000000000..9f4a4c8536bc19785c5d8b3ba9242fd6612dcaa6 GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/native/uiabtest/Release/uiabtest.exe b/native/uiabtest/Release/uiabtest.exe new file mode 100644 index 0000000000000000000000000000000000000000..030141b9527c112abe8e61da39547e654a6412f9 GIT binary patch literal 52224 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 z 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 LC>RX^T897tGvE=G literal 0 HcmV?d00001 diff --git a/native/uiabtest/uiabtest.cpp b/native/uiabtest/uiabtest.cpp index c14b813..9c39bda 100644 --- a/native/uiabtest/uiabtest.cpp +++ b/native/uiabtest/uiabtest.cpp @@ -25,32 +25,67 @@ void outputResults(array ^winInfo) } +void runBasicTests(AutomationBridge ^ab, System::String ^propList) +{ + array ^winInfo = nullptr; + System::DateTime start; + System::Double seconds = 0; + + start = System::DateTime::Now; + ab->clearEnumFilters(); + ab->addEnumFilter("Parent/FrameworkIdProperty", "WinForm"); + winInfo = ab->enumWindowInfo(propList); + //outputResults(winInfo); + seconds = System::Math::Round(System::DateTime::Now.Subtract(start).TotalSeconds, 4); + Console::WriteLine(L"Total WinForm Elements: {0} in {1} seconds", winInfo->Length, seconds); + + start = System::DateTime::Now; + ab->clearEnumFilters(); + ab->addEnumFilter("Parent/FrameworkIdProperty", "WPF"); + winInfo = ab->enumWindowInfo(propList); + //outputResults(winInfo); + seconds = System::Math::Round(System::DateTime::Now.Subtract(start).TotalSeconds, 4); + Console::WriteLine(L"Total WPF Elements: {0} in {1} seconds", winInfo->Length, seconds); + + start = System::DateTime::Now; + ab->clearEnumFilters(); + winInfo = ab->enumWindowInfo(propList); + //outputResults(winInfo); + seconds = System::Math::Round(System::DateTime::Now.Subtract(start).TotalSeconds, 4); + Console::WriteLine(L"Total All Elements: {0} in {1} seconds", winInfo->Length, seconds); + Console::WriteLine(L"---------------------------------------"); +} + int main(array ^args) { Console::WriteLine(L"UI Automation Bridge Test"); - AutomationBridge ^ab = gcnew AutomationBridge(); - System::String ^propList = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ClassNameProperty,NameProperty"; + //System::String ^propList = L"RuntimeIdProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ClassNameProperty,NameProperty"; + System::String ^propList = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ControlTypeProperty,ClassNameProperty,NameProperty,BoundingRectangleProperty"; + AutomationBridge ^ab = gcnew AutomationBridge(propList); //System::String ^propList = L"RuntimeIdProperty,BoundingRectangleProperty"; Console::WriteLine(propList); - //System::String ^winInfo1 = ab->getWindowInfo(System::IntPtr(3409618), propList); - System::DateTime start = System::DateTime::Now; + runBasicTests(ab, propList); + runBasicTests(ab, propList); + runBasicTests(ab, propList); + + //System::String ^winInfo1 = ab->getWindowInfo(System::IntPtr(3409618), propList); //ab->addEnumFilter("Parent/ClassNameProperty", "Notepad"); //ab->addEnumFilter("First/RuntimeIdProperty", "42-4784952"); //ab->addEnumFilter("ClassNameProperty", "Notepad"); //ab->addEnumFilter("All/ClassNameProperty", "Edit"); //ab->addEnumFilter("All/LocalizedControlTypeProperty", "menu item"); - ab->addEnumFilter("Parent/FrameworkIdProperty", "WinForm"); + //ab->addEnumFilter("Parent/FrameworkIdProperty", "WinForm"); //ab->addEnumFilter("Parent/FrameworkIdProperty", "WPF"); //ab->addEnumFilter("Parent/ClassNameProperty", "WindowsForms10.Window.8.app.0.2bf8098_r13_ad1"); - array ^winInfo = ab->enumWindowInfo(propList); //L"*" + //array ^winInfo = ab->enumWindowInfo(propList); //L"*" //ab->clearEnumFilters(); //ab->addEnumFilter("Parent/FrameworkIdProperty", "WinForm"); //array ^winInfo = ab->enumWindowInfo(System::IntPtr(3409618), propList); //L"*" //array ^winInfo = ab->enumWindowInfo(System::IntPtr(12977932), propList); //L"*" //Console::WriteLine("enumWindowInfo x,y: {0}", ab->getWindowInfo(100,100, propList); //L"*" - outputResults(winInfo); + //outputResults(winInfo); //Globals::Global::AUTO_BRIDGE->clearEnumFilters(); //winInfo = nullptr; //winInfo = Globals::Global::AUTO_BRIDGE->enumWindowInfo(System::IntPtr(7603636), propList); @@ -64,8 +99,9 @@ int main(array ^args) //array ^winInfo2 = ab->enumWindowInfo(propList); //L"*" //outputResults(winInfo2); - System::Double seconds = System::Math::Round(System::DateTime::Now.Subtract(start).TotalSeconds, 4); - Console::WriteLine(L"Total Elements: {0} in {1} seconds", winInfo->Length, seconds); + //System::Double seconds = System::Math::Round(System::DateTime::Now.Subtract(start).TotalSeconds, 4); + //Console::WriteLine(L"Total Elements: {0} in {1} seconds", winInfo->Length, seconds); + Console::WriteLine(L"press any key to exit"); getch();//wait for user input return 0; } diff --git a/src/org/synthuse/Api.java b/src/org/synthuse/Api.java index 6dcea55..a5c0e79 100644 --- a/src/org/synthuse/Api.java +++ b/src/org/synthuse/Api.java @@ -15,9 +15,11 @@ import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.Structure; import com.sun.jna.platform.win32.WinDef.*; +import com.sun.jna.platform.win32.Advapi32Util; import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR; import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinNT.HANDLE; +import com.sun.jna.platform.win32.WinReg; import com.sun.jna.platform.win32.WinUser; import com.sun.jna.platform.win32.WinNT.LARGE_INTEGER; import com.sun.jna.platform.win32.WinUser.WNDENUMPROC; @@ -133,6 +135,11 @@ public class Api { return (int) (i & 0xFFFF); } + public static long MAKELONG(int low, int high) + { + return ((long)(((short)((int)(low) & 0xffff)) | ((int)((short)((int)(high) & 0xffff))) << 16)); + } + public interface WinDefExt extends WinDef { //Structures public class MENUITEMINFO extends Structure { @@ -235,6 +242,7 @@ public class Api { //HWND WindowFromPoint(POINT point); HMENU GetMenu(HWND hWnd); + HMENU GetSystemMenu(HWND hWnd, boolean bRevert); boolean IsMenu(HMENU hMenu); int GetMenuString(HMENU hMenu, int uIDItem, char[] buffer, int nMaxCount, int uFlag); HMENU GetSubMenu(HMENU hMenu, int nPos); @@ -243,7 +251,7 @@ public class Api { //BOOL WINAPI GetMenuItemInfo(_In_ HMENU hMenu, _In_ UINT uItem, _In_ BOOL fByPosition, _Inout_ LPMENUITEMINFO lpmii); boolean GetMenuItemInfoA(HMENU hMenu, int uItem, boolean fByPosition, WinDefExt.MENUITEMINFO mii); //MENUITEMINFO boolean TrackPopupMenu(HMENU hMenu, int uFlags, int x, int y, int nReserved, HWND hWnd, long prcRect); - // + boolean GetMenuItemRect(HWND hWnd, HMENU hMenu, int uItem, RECT rect); int GetDlgCtrlID(HWND hwndCtl); int GetDlgItemText(HWND hDlg, int nIDDlgItem, byte[] buffer, int nMaxCount); @@ -536,4 +544,10 @@ public class Api { User32.instance.RedrawWindow(hwnd, 0, 0, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); } + public static boolean isDotNet4Installed() { + int installed = Advapi32Util.registryGetIntValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4.0\\Client", "Install"); + //System.out.println("isDotNet4Installed: " + installed); + return (installed == 1); + } + } diff --git a/src/org/synthuse/CommandPopupMenu.java b/src/org/synthuse/CommandPopupMenu.java index bc535a8..c085af7 100644 --- a/src/org/synthuse/CommandPopupMenu.java +++ b/src/org/synthuse/CommandPopupMenu.java @@ -109,6 +109,9 @@ public class CommandPopupMenu extends JPopupMenu { CommandMenuItem mntmSelectMenu = new CommandMenuItem("selectMenu", 2); mnWinMessages.add(mntmSelectMenu); + + CommandMenuItem mntmSelectContextMenuId = new CommandMenuItem("selectContextMenuId", 3); + mnWinMessages.add(mntmSelectContextMenuId); CommandMenuItem mntmSetcursorposition = new CommandMenuItem("setCursorPosition", 3); mnWinMessages.add(mntmSetcursorposition); diff --git a/src/org/synthuse/CommandProcessor.java b/src/org/synthuse/CommandProcessor.java index 5317da5..f69d185 100644 --- a/src/org/synthuse/CommandProcessor.java +++ b/src/org/synthuse/CommandProcessor.java @@ -205,6 +205,8 @@ public class CommandProcessor implements Runnable{ return win.cmdWindowFocus(args); if (command.equals("selectMenu")) return win.cmdSelectMenu(args); + if (command.equals("selectContextMenuId")) + return win.cmdSelectContextMenuId(args); if (command.equals("windowMinimize")) return win.cmdWindowMinimize(args); if (command.equals("windowMaximize")) diff --git a/src/org/synthuse/KeyboardHook.java b/src/org/synthuse/KeyboardHook.java index 397ed09..ff3b4d9 100644 --- a/src/org/synthuse/KeyboardHook.java +++ b/src/org/synthuse/KeyboardHook.java @@ -131,7 +131,7 @@ public class KeyboardHook implements Runnable{ } // search target keyboard event list for a match and return it otherwise return null if no match - public TargetKeyPress getTargetKeyPressed(int keyCode) { + private TargetKeyPress getTargetKeyPressed(int keyCode) { TargetKeyPress target = null; for (TargetKeyPress tkp : KeyboardHook.targetList) { if (tkp.targetKeyCode != keyCode) @@ -159,6 +159,7 @@ public class KeyboardHook implements Runnable{ @Override public void run() { createGlobalKeyboardHook(); + System.out.println("Unhooking Global Keyboard Hook"); unhook();//wait for quit == true then unhook } diff --git a/src/org/synthuse/MenuInfo.java b/src/org/synthuse/MenuInfo.java index 8ca3217..2900c75 100644 --- a/src/org/synthuse/MenuInfo.java +++ b/src/org/synthuse/MenuInfo.java @@ -10,7 +10,7 @@ package org.synthuse; import java.math.BigInteger; import com.sun.jna.Pointer; -import com.sun.jna.platform.win32.WinDef.HMENU; +import com.sun.jna.platform.win32.WinDef.*; public class MenuInfo { public HMENU hmenu = null; @@ -25,12 +25,15 @@ public class MenuInfo { public HMENU submenu = null; public String submenuStr = ""; public int submenuCount = 0; + public String center = ""; - public MenuInfo(HMENU hmenu) { + public MenuInfo(String hwndStr, HMENU hmenu) { + this.hwndStr = hwndStr; loadMenuBase(hmenu); } - public MenuInfo(HMENU hmenu, int position) { + public MenuInfo(String hwndStr, HMENU hmenu, int position) { + this.hwndStr = hwndStr; loadMenuBase(hmenu); if (this.menuCount > 0) loadMenuDetails(hmenu, position); @@ -52,6 +55,14 @@ public class MenuInfo { this.text = this.text.substring(0, this.text.indexOf("\t")); this.text = text.replaceAll("[^a-zA-Z0-9.,\\+ ]", ""); this.id = api.user32.GetMenuItemID(hmenu, position); + /* + HWND hWnd = Api.GetHandleFromString(hwndStr); + RECT rect = new RECT(); + api.user32.GetMenuItemRect(hWnd, hmenu, position, rect); + int centerX = ((rect.right - rect.left) / 2) + rect.left; + int centerY = ((rect.bottom - rect.top) / 2) + rect.top; + this.center = centerX + "," + centerY; + */ HMENU submenu = api.user32.GetSubMenu(hmenu, position); if (submenu != null) { int subCount = api.user32.GetMenuItemCount(submenu); diff --git a/src/org/synthuse/RobotMacro.java b/src/org/synthuse/RobotMacro.java index 999365b..04d7115 100644 --- a/src/org/synthuse/RobotMacro.java +++ b/src/org/synthuse/RobotMacro.java @@ -68,7 +68,7 @@ public class RobotMacro { public static void rightClickMouse() { try { - System.out.println("rightClickMouse"); + //System.out.println("rightClickMouse"); Robot robot = new Robot(); //robot.mouseMove(200, 200); //robot.delay(1000); diff --git a/src/org/synthuse/SynthuseDlg.java b/src/org/synthuse/SynthuseDlg.java index a2b5d71..8a173f2 100644 --- a/src/org/synthuse/SynthuseDlg.java +++ b/src/org/synthuse/SynthuseDlg.java @@ -71,7 +71,7 @@ public class SynthuseDlg extends JFrame { /** * */ - public static String VERSION_STR = "1.1.3"; + public static String VERSION_STR = "1.1.4"; public static String RES_STR_MAIN_ICON = "/org/synthuse/img/gnome-robots.png"; public static String RES_STR_REFRESH_IMG = "/org/synthuse/img/rapidsvn.png"; diff --git a/src/org/synthuse/UiaBridge.java b/src/org/synthuse/UiaBridge.java index b4cf59e..3f84b10 100644 --- a/src/org/synthuse/UiaBridge.java +++ b/src/org/synthuse/UiaBridge.java @@ -6,8 +6,13 @@ import java.io.*; import javax.swing.JOptionPane; public class UiaBridge { + + public static String CACHED_PROPERTY_LIST = "RuntimeIdProperty,ParentRuntimeIdProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ClassNameProperty,NameProperty,ValueProperty,BoundingRectangleProperty"; + static { + if (!Api.isDotNet4Installed()) //if .net 4.0 isn't installed don't use uiabridge + SynthuseDlg.config.disableUiaBridge = "true"; if (!SynthuseDlg.config.isUiaBridgeDisabled()) { //System.out.println("SynthuseDlg.config.disableUiaBridge: " + SynthuseDlg.config.disableUiaBridge); String archDataModel = System.getProperty("sun.arch.data.model");//32 or 64 bit @@ -78,7 +83,7 @@ public class UiaBridge { public UiaBridge () { if (!SynthuseDlg.config.isUiaBridgeDisabled()) - initialize(""); + initialize(CACHED_PROPERTY_LIST); } public native void initialize(String properties); diff --git a/src/org/synthuse/WindowInfo.java b/src/org/synthuse/WindowInfo.java index fa1c226..242b304 100644 --- a/src/org/synthuse/WindowInfo.java +++ b/src/org/synthuse/WindowInfo.java @@ -26,6 +26,7 @@ public class WindowInfo { public static String UIA_PROPERTY_LIST = "RuntimeIdProperty,ParentRuntimeIdProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ClassNameProperty,NameProperty,ValueProperty"; public static String UIA_RUNTIME_ID = "RuntimeIdProperty"; + public static String UIA_BOUNDING_RECT = "BoundingRectangleProperty"; public static int MAX_TEXT_SIZE = 200; public HWND hwnd; @@ -96,23 +97,7 @@ public class WindowInfo { extra = new LinkedHashMap(); extra.put("tvCount", tvCount.intValue() + ""); } - - //check if window has a menu - HMENU hmenu = Api.User32.instance.GetMenu(hWnd); - if (hmenu != null) { //menu item count - int menuCount = Api.User32.instance.GetMenuItemCount(hmenu); - if (menuCount > 0) { - this.menus = menuCount; - this.menu = hmenu; - } - else - { - LRESULT result = Api.User32.instance.PostMessage(hWnd, Api.MN_GETHMENU, new WPARAM(0), new LPARAM()); - if (result.longValue() != 1) - System.out.println("MN_GETHMENU: " + result.longValue()); - } - } - + /* if (isChild) { int ctrlID = Api.User32.instance.GetDlgCtrlID(hWnd); if (ctrlID > 0){ @@ -125,12 +110,40 @@ public class WindowInfo { extra.put("dgText", dgText + ""); } } - } + }*/ char[] buffer2 = new char[1026]; User32.instance.GetClassName(hWnd, buffer2, 1026); className = Native.toString(buffer2); + //check if window has a menu + HMENU hmenu = Api.User32.instance.GetMenu(hWnd); + if (hmenu != null) { //menu item count + int menuCount = Api.User32.instance.GetMenuItemCount(hmenu); + if (menuCount > 0) { + this.menus = menuCount; + this.menu = hmenu; + } + } + else // if (className.equals("#32768")) //check if its a popup menu window + { + //LRESULT result = Api.User32.instance.PostMessage(hWnd, Api.MN_GETHMENU, new WPARAM(0), new LPARAM(0)); + LRESULT result = Api.User32.instance.SendMessage(hWnd, Api.MN_GETHMENU, new WPARAM(0), new LPARAM(0)); + if (result.longValue() != 1) + { + //System.out.println("MN_GETHMENU: " + result.longValue()); + hmenu = new HMENU(new Pointer(result.longValue())); + int menuCount = Api.User32.instance.GetMenuItemCount(hmenu); + if (menuCount > 0) + { + //System.out.println("Popup Win: " + menuCount); + this.menus = menuCount; + this.menu = hmenu; + } + } + } + + rect = new RECT(); User32.instance.GetWindowRect(hWnd, rect); diff --git a/src/org/synthuse/WindowsEnumeratedXml.java b/src/org/synthuse/WindowsEnumeratedXml.java index 8f7396e..7c2b1cf 100644 --- a/src/org/synthuse/WindowsEnumeratedXml.java +++ b/src/org/synthuse/WindowsEnumeratedXml.java @@ -249,16 +249,18 @@ public class WindowsEnumeratedXml implements Runnable{ public static Element buildMenuXmlElements(Document xmlDoc, Element xmlElement, HMENU targetMenu, String targetWin) { - MenuInfo firstMi = new MenuInfo(targetMenu); + MenuInfo firstMi = new MenuInfo(targetWin, targetMenu); for (int i = 0 ; i < firstMi.menuCount ; i++ ) { - MenuInfo menuInfo = new MenuInfo(targetMenu, i); + MenuInfo menuInfo = new MenuInfo(targetWin, targetMenu, i); Element menuElement = xmlDoc.createElement("menu"); menuElement.setAttribute("unaltered", menuInfo.unaltered + ""); menuElement.setAttribute("text", menuInfo.text + ""); menuElement.setAttribute("id", menuInfo.id + ""); menuElement.setAttribute("position", menuInfo.position + ""); menuElement.setAttribute("hmenu", menuInfo.hmenuStr + ""); - menuElement.setAttribute("hwnd", targetWin + ""); + menuElement.setAttribute("hwnd", menuInfo.hwndStr + ""); + if (!menuInfo.center.isEmpty()) + menuElement.setAttribute("center", menuInfo.center + ""); if (menuInfo.hasSubMenu) { buildMenuXmlElements(xmlDoc, menuElement, menuInfo.submenu, targetWin); } diff --git a/src/org/synthuse/commands/WindowsCommands.java b/src/org/synthuse/commands/WindowsCommands.java index 0a8b5eb..7180508 100644 --- a/src/org/synthuse/commands/WindowsCommands.java +++ b/src/org/synthuse/commands/WindowsCommands.java @@ -122,6 +122,22 @@ public class WindowsCommands extends BaseCommand { //LRESULT result = //System.out.println("PostMessage to " + handle.hWndStr + " for id " + id); api.user32.PostMessage(handle.hWnd, Api.WM_COMMAND, new WPARAM(id), new LPARAM(0)); + //api.user32.SendMessage(handle.hWnd, Api.WM_COMMAND, new WPARAM(id), new LPARAM(0)); + return true; + } + + public boolean cmdSelectContextMenuId(String[] args) { + if (!checkArgumentLength(args, 2)) + return false; + WinPtr handle = findHandleWithXpath(args[0]); //xpath to HWND is first argument + if (handle.isEmpty()) + return false; + int id = Integer.parseInt(args[1]); //context menu id is supplied as second argument + //LRESULT result = + System.out.println("PostMessage to " + handle.toString() + " for id " + id + " - " + Api.MAKELONG(id, 0)); + //api.user32.PostMessage(handle.hWnd, Api.WM_COMMAND, new WPARAM(id), new LPARAM(0)); + api.user32.SendMessage(handle.hWnd, Api.WM_COMMAND, new WPARAM(Api.MAKELONG(id, 0)), new LPARAM(0)); + return true; } }