public void Run() { Process process = null; try { process = Process.Start(executablePath); process.WaitForInputIdle(); int width = 0, height = 0; User32.WINDOWINFO windowInfo = default; windowInfo = GetWindowInfo(process.MainWindowHandle); width = windowInfo.rcWindow.right - windowInfo.rcWindow.left; height = windowInfo.rcWindow.bottom - windowInfo.rcWindow.top; #if DEBUG // If Notepad was started, test different window sizes. if (executablePath == "notepad") { width = 300; height = 600; } #endif ResetWindowPosition(process.MainWindowHandle, width, height); InitializeMagnification(); backgroundWindow = new BackgroundWindow(process.MainWindowHandle, desktopWidth, desktopHeight).Show(); User32.ShowCursor(false); var refreshInterval = 200; var previousRect = new RECT(); bool pause = false, forceUpdate = false; while (!process.HasExited) { if ((User32.GetAsyncKeyState((int)User32.VirtualKey.VK_LWIN)) != 0 && (User32.GetAsyncKeyState((int)User32.VirtualKey.VK_ESCAPE)) != 0) { pause = !pause; if (pause) { backgroundWindow.Hide(); ResetMagnification(); } else { backgroundWindow.Show(); forceUpdate = true; } } if (pause) { Thread.Sleep(refreshInterval); continue; } if (User32.GetForegroundWindow() != process.MainWindowHandle) { User32.SetForegroundWindow(process.MainWindowHandle); } windowInfo = GetWindowInfo(process.MainWindowHandle); if (windowInfo.rcWindow.left != 0 || windowInfo.rcWindow.top != 0) { ResetWindowPosition(process.MainWindowHandle, windowInfo); windowInfo = GetWindowInfo(process.MainWindowHandle); } if (forceUpdate || !windowInfo.rcClient.Equals(previousRect)) { SetMagnification(windowInfo); previousRect = windowInfo.rcClient; } if (forceUpdate) { forceUpdate = false; } Thread.Sleep(refreshInterval); } } catch (Exception ex) { ex.Message.Log(); if (process != null && !process.HasExited) { process.Kill(); } } finally { try { User32.ShowCursor(true); } catch { } try { Magnification.MagUninitialize(); } catch { } try { backgroundWindow?.Hide(); } catch { } } }