Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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}");
            }
        }