• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#判断窗体是否被遮挡,是否完全显示

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

思路:

1.获取显示在需判断窗体之上的其他窗体(一个或多个)

2.获取这些窗体的矩形信息

3.判断这些窗体和需判断窗体的矩形是否相交

4.处理一些特殊情况,如任务栏和开始按钮(可略过)

 

适用场景:在窗体失去焦点的情况下,判断窗体是否显示完全

 

具体代码如下:

using System.Runtime.InteropServices;
using System;
using System.Windows.Forms;
using System.Drawing;

namespace WindowTimeDev
{
    public static class FormHelper
    {
        static Rectangle ScreenRectangle = Rectangle.Empty;

        static FormHelper()
        {
            ScreenRectangle = Screen.PrimaryScreen.WorkingArea;
        }

        [DllImport("user32.dll")]
        public static extern IntPtr GetWindow(IntPtr hWnd, uint wWcmd);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

        [DllImport("user32.dll")]
        public static extern bool IsWindowVisible(IntPtr hWnd);

        public static bool IsOverlapped(Form form)
        {
            return isoverlapped(form.Handle, form);
        }

        private static bool isoverlapped(IntPtr win, Form form)
        {
            IntPtr preWin = GetWindow(win, 3); //获取显示在Form之上的窗口

            if (preWin == null || preWin == IntPtr.Zero)
                return false;

            if (!IsWindowVisible(preWin))
                return isoverlapped(preWin, form);

            RECT rect = new RECT();
            if (GetWindowRect(preWin, ref rect)) //获取窗体矩形
            {
                Rectangle winrect = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);

                if (winrect.Width == ScreenRectangle.Width && winrect.Y == ScreenRectangle.Height) //菜单栏。不判断遮挡(可略过)
                    return isoverlapped(preWin, form);

                if (winrect.X == 0 && winrect.Width == 54 && winrect.Height == 54) //开始按钮。不判断遮挡(可略过)
                    return isoverlapped(preWin, form);

                Rectangle formRect = new Rectangle(form.Location, form.Size); //Form窗体矩形
                if (formRect.IntersectsWith(winrect)) //判断是否遮挡
                    return true;
            }

            return isoverlapped(preWin, form);
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }
}

 

在窗体中使用时的代码如下:

if(FormHelper.IsOverlapped(this))
{
   //具体操作,比如把窗口显示到前台
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#API项目中配置Swagger发布时间:2022-07-10
下一篇:
C#wpf程序获取当前程序版本发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap