Пример #1
0
        //#################################################################################################################

        public static void FillScreen(Form form, WinApi.MONITORINFO screen)
        {
            var rect = screen.rcMonitor;

            int x = rect.Left - s_combinedRect.Left;
            int y = rect.Top - s_combinedRect.Top;

            WinApi.MoveWindow(form.Handle, x, y, rect.Width, rect.Height, false);
        }
Пример #2
0
        //#################################################################################################################

        public static void Initialize()
        {
            s_combinedRect = new WinApi.RECT(0, 0, 0, 0);

            List <WinApi.MONITORINFO> screens = new List <WinApi.MONITORINFO>();

            WinApi.MonitorEnumDelegate callback = (IntPtr hDesktop, IntPtr hdc, ref WinApi.RECT pRect, int d) =>
            {
                var info = new WinApi.MONITORINFO();
                info.cbSize = sizeof(int) * 4 * 2 + sizeof(int) * 2;
                if (WinApi.GetMonitorInfo(hDesktop, ref info) == false)
                {
                    return(false);
                }

                var rect = info.rcMonitor;
                if (rect.Left < s_combinedRect.Left)
                {
                    s_combinedRect.Left = rect.Left;
                }
                if (rect.Top < s_combinedRect.Top)
                {
                    s_combinedRect.Top = rect.Top;
                }
                if (rect.Right > s_combinedRect.Right)
                {
                    rect.Right = s_combinedRect.Right;
                }
                if (rect.Bottom > s_combinedRect.Bottom)
                {
                    rect.Bottom = s_combinedRect.Bottom;
                }

                screens.Add(info);

                return(true);
            };

            if (WinApi.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, callback, 0))
            {
                Screens = screens.ToArray();
            }
            else
            {
                Screens = new[]
                {
                    new WinApi.MONITORINFO()
                    {
                        rcMonitor = Screen.PrimaryScreen.Bounds,
                        rcWork    = Screen.PrimaryScreen.WorkingArea,
                    }
                };
            }
        }
Пример #3
0
        public static bool IsOverlayed(Form form)
        {
            /// 전체화면이더라도 무시할 클래스명 목록
            string[] classNamesExcluded =
            {
                "WorkerW",                              // 배경화면
                "ProgMan",
                "ImmersiveLauncher",                    // Win8 시작화면
            };


            // 최상위 컨트롤의 핸들을 얻는다.
            IntPtr foregroundWindow = WinApi.GetForegroundWindow();

            if (foregroundWindow == IntPtr.Zero)
            {
                return(false);
            }
            foregroundWindow = WinApi.GetAncestor(foregroundWindow, WinApi.GetAncestorFlags.GetRoot);


            // 자기 자신이면 가려진게 아님.
            if (foregroundWindow == form.Handle)
            {
                return(false);
            }


            // 컨트롤의 클래스이름을 얻어옵니다.
            string className = WinApi.GetClassName(foregroundWindow);

            if (className.Length <= 0)
            {
                return(false);
            }


            // 제외목록에서 하나라도 해당되는지 확인.
            if (classNamesExcluded.Any((s) => s.ToUpper() == className.ToUpper()))
            {
                return(false);
            }


            // 현재 컨트롤이 속하는 모니터의 사각영역을 얻어옵니다.
            WinApi.RECT desktop;
            IntPtr      monitor = WinApi.MonitorFromWindow(form.Handle, WinApi.MONITOR_DEFAULTTONEAREST);

            if (monitor == IntPtr.Zero)
            {
                // 모니터를 찾을 수 없으면 현재 윈도우 화면의 핸들로 설정한다.
                IntPtr desktopWnd = WinApi.GetDesktopWindow();
                if (desktopWnd == IntPtr.Zero)
                {
                    return(false);
                }

                if (WinApi.GetWindowRect(desktopWnd, out desktop) == false)
                {
                    return(false);
                }
            }
            else
            {
                var info = new WinApi.MONITORINFO();
                info.cbSize = sizeof(int) * 4 * 2 + sizeof(int) * 2;
                if (WinApi.GetMonitorInfo(monitor, ref info) == false)
                {
                    return(false);
                }

                desktop = info.rcMonitor;
            }


            // 컨트롤의 작업영역을 알아낸다.
            WinApi.RECT client;
            if (WinApi.GetWindowRect(foregroundWindow, out client) == false)
            {
                return(false);
            }


            // 컨트롤이 모니터에 완전히 들어오지 않았거나 크기보다 작으면 전체화면이 아니다.
            if (client.Left > desktop.Left + 1
                ||
                client.Top > desktop.Top + 1
                ||
                client.Right < desktop.Right - 1
                ||
                client.Bottom < desktop.Bottom - 1)
            {
                return(false);
            }


            // 여기까지 도달했으면 전체화면이다.
            return(true);
        }