From 33522694e4f00b3650b3bec7203f0fcad953aa52 Mon Sep 17 00:00:00 2001 From: Edward Jakubowski Date: Wed, 14 May 2014 08:17:58 -0400 Subject: [PATCH] Added more exception handling in uiabridge, fixing Keyboard hook stability uiabridge was having issues with getting ValueProperty from the cached values. uiabridge was throwing exceptions if it couldn't find a missing HWND handle. Fixing keyboard hook to last longer. --- native/uiabridge/bin/uiabridge32.dll | Bin 77824 -> 77824 bytes native/uiabridge/bin/uiabridge64.dll | Bin 91648 -> 92160 bytes native/uiabridge/uiabridge.cpp | 51 ++++++++++++++++++++++----- native/uiabridge/uiabridge.h | 1 + src/org/synthuse/KeyboardHook.java | 41 ++++++++++++++++----- src/org/synthuse/SynthuseDlg.java | 2 +- 6 files changed, 76 insertions(+), 19 deletions(-) diff --git a/native/uiabridge/bin/uiabridge32.dll b/native/uiabridge/bin/uiabridge32.dll index 7969ec0bc3eeb178c79c78df5af78eb5169e2886..4a7088491563f588a9438fa56cbf4cac5d53967e 100644 GIT binary patch delta 30645 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 EU(1xplK=n! delta 30291 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 diff --git a/native/uiabridge/uiabridge.cpp b/native/uiabridge/uiabridge.cpp index d6dfeff..d095bdd 100644 --- a/native/uiabridge/uiabridge.cpp +++ b/native/uiabridge/uiabridge.cpp @@ -67,7 +67,9 @@ void AutomationBridge::initializeCache(System::String ^cachedProperties) if (cachedPropStr->Contains(L"ValueProperty")) //special property not in the root property list { cacheList->Add(ValuePattern::ValueProperty); + cacheRequest->Add(AutomationElement::IsValuePatternAvailableProperty); cacheRequest->Add(ValuePattern::ValueProperty); + cacheRequest->Add(ValuePattern::Pattern); } for each(AutomationProperty ^ap in rootProperties) //loop through all supported Properties for a child { @@ -109,8 +111,8 @@ Boolean AutomationBridge::isElementFiltered(System::Windows::Automation::Automat int filterMatchCount = 0; if (enumFilters->Count == 0) return result; - array ^aps = cachedRootProperties;//element->GetSupportedProperties(); - for each(AutomationProperty ^ap in aps) //loop through all supported Properties for a child + //array ^aps = cachedRootProperties;//element->GetSupportedProperties(); + for each(AutomationProperty ^ap in cachedRootProperties) //loop through all supported Properties for a child { System::String ^currentPropertyStr = L""; //current property values System::String ^shortPropName = L" null "; @@ -252,8 +254,16 @@ array ^ AutomationBridge::enumWindowInfo(System::String ^prope array ^ AutomationBridge::enumWindowInfo(System::IntPtr windowHandle, System::String ^properties) { - AutomationElement ^element = AutomationElement::FromHandle(windowHandle); List ^winInfoList = gcnew List(); + AutomationElement ^element = nullptr; + try { + element = AutomationElement::FromHandle(windowHandle); + } catch (Exception ^ex) { + output(ex, ""); + return winInfoList->ToArray(); + } + if (element == nullptr) + return winInfoList->ToArray(); if (!isElementFiltered(element)) //test parent should be filtered winInfoList->Add(getWindowInfo(element, properties, nullptr)); winInfoList->AddRange(enumWindowInfo(element, properties)); @@ -307,7 +317,7 @@ array ^ AutomationBridge::enumWindowInfo(AutomationElement ^pa //currentElement-> } catch (Exception ^ex) { - System::Console::WriteLine("Exception: {0} {1}", ex->Message, ex->StackTrace); + output(ex, ""); } currentElement = tw->GetNextSibling(currentElement, cacheRequest); } @@ -342,7 +352,7 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys System::String ^delim = L","; array ^propSpltArray = properties->Split(delim->ToCharArray()); System::Int32 count = 0; - array ^aps = cachedRootProperties;//element->GetSupportedProperties(); + //array ^aps = cachedRootProperties;//element->GetSupportedProperties(); array ^propValues = gcnew array(propSpltArray->Length);//keep order System::String ^wildcardProperties = L""; if (wildcardEnabled) { @@ -357,7 +367,7 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys propValues[i] = parentRuntimeId; } } - for each(AutomationProperty ^ap in aps) //loop through all supported Properties for a child + for each(AutomationProperty ^ap in cachedRootProperties) //loop through all supported Properties for a child { propertyNameErrorCheck = ap->ProgrammaticName;//debug purposes System::String ^currentPropertyStr = L""; //current property values @@ -369,7 +379,15 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys { //System::Console::WriteLine("shortPropName: {0}", shortPropName); //System::Object ^currentVal = element->GetCurrentPropertyValue(ap); - System::Object ^currentVal = element->GetCachedPropertyValue(ap); + System::Object ^currentVal = nullptr; + if (shortPropName->Equals("ValueProperty")) //check if Value Pattern is an Available Property + { + if (((Boolean)element->GetCurrentPropertyValue(element->IsValuePatternAvailableProperty)) == false) + continue; + else + currentVal = element->GetCurrentPropertyValue(ap); //cached pattern was having issues; + } + currentVal = element->GetCachedPropertyValue(ap); if (currentVal == nullptr) continue; if (ap->ProgrammaticName->Equals(L"AutomationElementIdentifiers.RuntimeIdProperty")) @@ -409,7 +427,7 @@ System::String ^ AutomationBridge::getWindowInfo(AutomationElement ^element, Sys 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); + output(ex, " getWindowInfo on " + propertyNameErrorCheck + ", results: " + resultProperties); } return resultProperties; @@ -418,12 +436,22 @@ 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)); + if (element == nullptr) + return ""; return getWindowInfo(element, properties, nullptr); } System::String ^ AutomationBridge::getWindowInfo(System::IntPtr windowHandle, System::String ^properties) { - AutomationElement ^element = AutomationElement::FromHandle(windowHandle); + AutomationElement ^element = nullptr; + try { + AutomationElement ^element = AutomationElement::FromHandle(windowHandle); + } catch (Exception ^ex) { + output(ex, ""); + return ""; + } + if (element == nullptr) + return ""; return getWindowInfo(element, properties, nullptr); } @@ -439,3 +467,8 @@ System::String ^ AutomationBridge::getWindowInfo(System::String ^runtimeIdStr, S return ""; //return getWindowInfo(element, properties); } + +void AutomationBridge::output(Exception ^ex, System::String ^message) +{ + System::Console::WriteLine("Exception ({0}): {1} \n{2}", message, ex->Message, ex->StackTrace); +} diff --git a/native/uiabridge/uiabridge.h b/native/uiabridge/uiabridge.h index 30c8103..6025d86 100644 --- a/native/uiabridge/uiabridge.h +++ b/native/uiabridge/uiabridge.h @@ -40,6 +40,7 @@ namespace uiabridge { static System::String ^DEFAULT_CACHED_PROPS = L"RuntimeIdProperty,ParentRuntimeIdProperty,NativeWindowHandleProperty,ProcessIdProperty,FrameworkIdProperty,LocalizedControlTypeProperty,ControlTypeProperty,ClassNameProperty,NameProperty,BoundingRectangleProperty,ValueProperty"; private: void initializeCache(System::String ^cachedProperties); + void output(Exception ^ex, System::String ^message); Dictionary ^enumFilters; void AutomationBridge::processFilterModifier(Boolean filtered, Boolean modifierChanged, List ^filterModifierList); CacheRequest ^cacheRequest; diff --git a/src/org/synthuse/KeyboardHook.java b/src/org/synthuse/KeyboardHook.java index 7fc7e63..034d311 100644 --- a/src/org/synthuse/KeyboardHook.java +++ b/src/org/synthuse/KeyboardHook.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.List; import com.sun.jna.*; +import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinUser.*; import com.sun.jna.platform.win32.WinDef.*; import com.sun.jna.win32.W32APIOptions; @@ -62,8 +63,9 @@ public class KeyboardHook implements Runnable{ public static LowLevelKeyboardProc lpfn; public static volatile boolean quit = false; - public interface User32 extends W32APIOptions { - User32 instance = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS); + + public interface User32Ex extends W32APIOptions { + User32Ex instance = (User32Ex) Native.loadLibrary("user32", User32Ex.class, DEFAULT_OPTIONS); LRESULT LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam); HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HMODULE hMod, int dwThreadId); @@ -72,11 +74,13 @@ public class KeyboardHook implements Runnable{ boolean PeekMessage(MSG lpMsg, HWND hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg); boolean UnhookWindowsHookEx(HHOOK idHook); short GetKeyState(int nVirtKey); + short GetAsyncKeyState(int nVirtKey); //public static interface HOOKPROC extends StdCallCallback { // LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam); //} } + public interface Kernel32 extends W32APIOptions { Kernel32 instance = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class, DEFAULT_OPTIONS); @@ -97,29 +101,48 @@ public class KeyboardHook implements Runnable{ events.keyPressed(target); //if (lParam.vkCode == 87) //w // quit = true; - return User32.instance.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer()); + return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer()); } }; - hHook = User32.instance.SetWindowsHookEx(WH_KEYBOARD_LL, lpfn, hMod, 0); + hHook = User32.INSTANCE.SetWindowsHookEx(WH_KEYBOARD_LL, lpfn, hMod, 0); if (hHook == null) return; MSG msg = new MSG(); + int cnt = 0; try { while (!quit) { - User32.instance.PeekMessage(msg, null, 0, 0, 0); + User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1); Thread.sleep(10); + ++cnt; + if (cnt > 500) + { + cnt = 0; + //System.out.println("heartbeat test"); + } } } catch (Exception e) { e.printStackTrace(); } + /* + while (!quit) { + // hex arguments: WM_KEYFIRST, WM_KEYLAST + int result = User32.INSTANCE.GetMessage(msg, null, 0x100, 0x109); + if (result == -1) { + break; + } else { + User32.INSTANCE.TranslateMessage(msg); + User32.INSTANCE.DispatchMessage(msg); + } + }*/ + //System.out.println("message loop stopped"); } //unhook the Global Windows Keyboard hook public void unhook() { if (hHook == null) return; - if (!User32.instance.UnhookWindowsHookEx(hHook)) + if (!User32.INSTANCE.UnhookWindowsHookEx(hHook)) System.out.println("Failed to unhook"); //System.out.println("Unhooked"); hHook = null; @@ -136,9 +159,9 @@ public class KeyboardHook implements Runnable{ for (TargetKeyPress tkp : KeyboardHook.targetList) { if (tkp.targetKeyCode != keyCode) continue; - if (!tkp.withShift || ((User32.instance.GetKeyState(VK_SHIFT) & 0x8000) != 0)) { - if (!tkp.withCtrl || ((User32.instance.GetKeyState(VK_CONTROL) & 0x8000) != 0)) { - if (!tkp.withAlt || ((User32.instance.GetKeyState(VK_MENU) & 0x8000) != 0)) { + if (!tkp.withShift || ((User32Ex.instance.GetKeyState(VK_SHIFT) & 0x8000) != 0)) { + if (!tkp.withCtrl || ((User32Ex.instance.GetKeyState(VK_CONTROL) & 0x8000) != 0)) { + if (!tkp.withAlt || ((User32Ex.instance.GetKeyState(VK_MENU) & 0x8000) != 0)) { return tkp; } } diff --git a/src/org/synthuse/SynthuseDlg.java b/src/org/synthuse/SynthuseDlg.java index 4fefe13..dc23951 100644 --- a/src/org/synthuse/SynthuseDlg.java +++ b/src/org/synthuse/SynthuseDlg.java @@ -72,7 +72,7 @@ public class SynthuseDlg extends JFrame { /** * */ - public static String VERSION_STR = "1.1.7"; + public static String VERSION_STR = "1.1.8"; 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";