• C#扩展桌面的处理


    Windows支持多显示器,可以另第二显示器(笔记本外接显示器)成为桌面一部分。

    复制:第二显示器与第一显示器显示一直

    扩展:第二显示器与第一显示器合并为1个桌面(第二显示器任务栏是否显示可调整)

     仅……:关闭另一个不用的显示器

     用C#开发程序时,对这种扩展桌面如何处理呢?需要注意的是,有时桌面的缩放比例也会被用户调整,这将导致第二个桌面的其实外置发生改变。

    1、Screen.AllScreens.Count()    //获得当前系统显示器数量

    2、Screen.FromControl(this).DeviceName    //当期窗体说在桌面名称

    3、Screen.FromControl(this).Bounds.Width   //当期窗体所在桌面宽度

    4、Screen.AllScreens[1].Bounds.Width  //第2桌面宽度

    5、Screen.AllScreens[0].WorkingArea.Height  //第1桌面可用区域高

    6、Screen.AllScreens[0].Bounds.Height - Screen.AllScreens[0].WorkingArea.Height  //任务栏高

    7、Screen.PrimaryScreen.Bounds.Width  //主显示边界宽

    8、获取桌面DPI缩放比例

            [DllImport("User32.dll", EntryPoint = "GetDC")]
            private extern static IntPtr GetDC(IntPtr hWnd);

            [DllImport("User32.dll", EntryPoint = "ReleaseDC")]
            private extern static int ReleaseDC(IntPtr hWnd, IntPtr hDC);

            [DllImport("gdi32.dll")]
            public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

            [DllImport("User32.dll")]
            public static extern int GetSystemMetrics(int hWnd);

            const int DESKTOPVERTRES = 117;
            const int DESKTOPHORZRES = 118;

            const int SM_CXSCREEN = 0;
            const int SM_CYSCREEN = 1;

            private static float GetDPIScale()
            {
                int x = GetSystemMetrics(SM_CXSCREEN);
                IntPtr hdc = GetDC(IntPtr.Zero);
                int w = GetDeviceCaps(hdc, DESKTOPHORZRES);
                return (float)w / x;
            }

    9、获取扩展桌面信息

    int myLeft = (int)((float)Screen.PrimaryScreen.Bounds.Width * GetDPIScale());

    int myTop = 0;
    int myWdith = Screen.AllScreens[1].Bounds.Width;
    int myHeight = Screen.AllScreens[1].Bounds.Height;
    ExtPlay.Left = myLeft;
    ExtPlay.Top = myTop;
    ExtPlay.Width = myWdith;
    ExtPlay.Height = myHeight;
    ExtPlay.Show();
    ExtPlay.TopMost = true;//窗体置顶层
    this.Focus();


    参考我的beigerExtPlay_A项目(2022年7月27日)

  • 相关阅读:
    数据结构之双向链表
    通过Node + SSE 做了一个构建日志推送
    [MFC]:Edit Control 编辑框控件之EN_KILLFOCUS消息只响应第一个失去焦点的问题分析
    密码暴力破解漏洞(kali crunch)
    ActiveMQ 笔记(九)Windows部署:单机与集群部署流程
    数据分析和互联网医院小程序:提高医疗决策的准确性和效率
    【BOOST C++ 18 数字处理】(3)Boost.MinMax
    深入理解JavaScript对象
    智慧城市-疫情流调系列2-Prompt-UIE信息抽取
    Mongoose【node.js的优雅mongodb对象建模】
  • 原文地址:https://blog.csdn.net/dgnankai/article/details/126018634