private bool EvalWindow(int hwndInt, int lParam) { var hwnd = new IntPtr(hwndInt); if (!IsAltTabWindow(hwnd)) { return(true); } // EnumWindows returns windows in Z order from back to front WindowsBackToTop.Add(hwnd); var winInfo = GetWindowInfoByHwnd(hwnd); var process = GetWindowProcessByHwnd(hwnd); var processId = process?.Id.ToString() ?? "?"; var name = GetWindowName(process, hwnd); var text = GetWindowTextByHwnd(hwnd); var window = new Window(name, text, hwnd, process, winInfo[0], winInfo[1]); HwndWindowDictionary.Add(hwnd.ToString(), window); Logger.Console($" - {name} '{text}' ({hwnd}; {processId}; {process?.MainModule?.FileName ?? "?"}) {winInfo[0]}"); return(true); }
private Window GetWindowByHwnd(IntPtr hwnd) { foreach (string key in HwndWindowDictionary.Keys) { var intptr = new IntPtr(Convert.ToInt32(key, 16)); if (intptr == hwnd && HwndWindowDictionary.TryGetValue(key, out Window win)) { return(win); } } return(null); }
internal void Restore(object sender, EventArgs e) { try { // ignore extra params // first, restore the window rectangles and normal/maximized/minimized states Dictionary <string, Window> newWindows = new Dictionary <string, Window>(); foreach (var hwndWindowPair in HwndWindowDictionary) { IntPtr hwnd = new IntPtr(Convert.ToInt32(hwndWindowPair.Key, 16)); Window win = hwndWindowPair.Value; if (RestrictedWindows.Contains(win.ProcessName)) { Logger.Console($"Not moving restricted window: {win.Details}"); continue; } if (!TryMoveWindow(hwnd, win)) { hwnd = FindHwndForDetachedWindow(win); if (newWindows.ContainsKey(hwnd.ToString())) { Logger.Console($"Not moving window: Duplicate hwnd found for window {win.Details}: {hwnd}"); continue; } if (hwnd == IntPtr.Zero) { Logger.Console($"Could not find hwnd for window {win.Details}"); continue; } if (!TryMoveWindow(hwnd, win)) { var lastErrorCode = GetLastError(); Logger.Log($"Can't move window {GetWindowName(null, hwnd)} ({hwnd}): {ResultWin32.GetErrorName(lastErrorCode)} ({lastErrorCode})"); continue; } } if (!newWindows.ContainsKey(hwnd.ToString())) { newWindows.Add(hwnd.ToString(), win); } else { Logger.Console($"Duplicate hwnd found for window {win.Details}: {hwnd}"); } } // now update the z-orders WindowsBackToTop = WindowsBackToTop.FindAll(IsWindowVisible); var positionStructure = BeginDeferWindowPos(WindowsBackToTop.Count); for (var i = 0; i < WindowsBackToTop.Count; i++) { positionStructure = UpdateZOrder(i, positionStructure); } HwndWindowDictionary.Clear(); foreach (var kvp in newWindows) { HwndWindowDictionary.Add(kvp.Key, kvp.Value); } EndDeferWindowPos(positionStructure); } catch (Exception ex) { Logger.Log($"Error restoring snapshot: {ex}"); } }