예제 #1
0
        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 { }
            }
        }