private static AutomationEventHandler GetOpenWindowHandler(int processId) { return((sender, e) => { AutomationElement element = sender as AutomationElement; string processName = Process.GetProcessById(element.Current.ProcessId).ProcessName; if (element.Current.ProcessId != processId && processName != Constants.pptProcess) { return; } IntPtr handle = new IntPtr(element.Current.NativeWindowHandle); string windowName = WindowUtil.GetWindowTitle(handle); if (windowName == "") { Logger.Log("Titleless window in windowwatcher: " + $"pID: {element.Current.ProcessId}\n" + $"process name: {processName}\n" + $"HWND: {handle}"); return; } lastOpenWindowName = windowName; WindowOpenTrigger resultTrigger = GetWindowTrigger(windowName); if (resultTrigger == null) { WindowUtil.CloseWindow(handle); //MessageBox.Show(windowName); return; } resultTrigger.resultingWindow = handle; resultTrigger.Set(); }); }
private static WindowOpenTrigger GetWindowTrigger(string windowName) { WindowOpenTrigger trigger = windowTriggers.FirstOrDefault(o => !o.Value.IsSet && o.Key == windowName).Value; if (trigger == null && whitelist.Contains(windowName)) { trigger = new WindowOpenTrigger(false); whitelistInstances.Add(windowName, trigger); } return(trigger); }
public static IntPtr Push(string name, Action action, int timeout = 5000) { WindowOpenTrigger whitelistTrigger = whitelistInstances.FirstOrDefault(o => o.Key == name).Value; if (whitelistTrigger != null) { whitelistInstances.Remove(name); return(whitelistTrigger.resultingWindow); } WindowOpenTrigger trigger = new WindowOpenTrigger(false); windowTriggers.Add(name, trigger); Task task = new Task(action); task.Start(); trigger.Wait(timeout); windowTriggers.Remove(name); Assert.IsTrue(trigger.IsSet, $"Timeout of {timeout}ms has been reached.{lastOpenWindowName}"); Assert.AreNotEqual(trigger.resultingWindow, IntPtr.Zero, "Found null window handle"); tasks.Push(task); return(trigger.resultingWindow); }