Winform程序实现多显示屏、多屏幕显示的2种方法

实现多屏显示目的:一般情况下是一个电脑显示屏,外接一个电视显示屏。在电脑上显示的一个窗体需要单独(没有窗体头,没有窗体边框)显示在电视上,并且还能再拉回电脑显示屏显示。

两种显示方法:

1、方法一:调用API

这种方法需要引微软的user32.dll,不过在VS中已经自动引过了,只需要加个外部引用

[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)]

private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

 

解释

SetWindowPos函数功能是将一个窗口在三维空间中移动,利用它,你可以改变一个窗口的位置,甚至可以在Z轴上改变(Z轴决定了一个窗口和其它窗口的前后关系),你还可以改变窗口的尺寸。为了实现TopMost类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可。

 

函数参考:

 英文官方说明:SetWindowPos function

英文不好的就看看中文:百度百科SetWindowPos

 

表1 SetWindowPos函数的参数解释

参数名 参数含义
hwnd
要移动的窗口的句柄(可以用窗体的hwnd属性)
hWndInsertAfter
关于如何在Z轴上放置窗口的标记(具体见表2
x
相当于窗口的Left属性--窗口的新坐标的x轴的位置
y
相当于窗口的Top属性--窗口的新坐标的y轴的位置
cx
相当于窗口的Right属性--窗口的新大小的宽
cy
相当于窗口的Bottom属性--窗口的新大小的高
wFlags
关于如何移动窗口的标记(具体见表3

表2 HWndInsertAfter参数的可能取值及含义

hWndInsertAfter的可能取值: 某一窗口的句柄;功能: 将窗口放在该句柄指定的窗口后面
HWND_BOTTOM(1)
把窗口放在Z轴的最后,即所有窗口的后面
HWND_TOP(0)
将窗口放在Z轴的前面,即所有窗口的前面
HWND_TOPMOST(-1)
使窗口成为“TopMost”类型的窗口,这种类型的窗口总是在其它窗口的前面,直到它被关闭
HWND_NOTOPMOST(-2)
将窗口放在所有“TopMost”类型窗口的后面、其它类型窗口的前面

表3 wFlags参数的可能值及含义

wFlags参数的可能值 功能说明
SWP_DRAWFRAME(&H20)
移动窗口后重画窗口及其上的所有内容
SWP_HIDEWINDOW(&H80)
隐藏窗口,窗口隐藏后既不出现在屏幕上也不出现在任务栏上,但它仍然处于激活状态
SWP_NOACTIVATE(&H10)
窗口移动后不激活窗口,当然,如果窗口在移动前就是激活的则例外
SWP_NOCOPYBITS(&H100)
当窗口移动后,不重画它上面的任何内容
SWP_NOMOVE(&H2)
不移动窗口(即忽略XY参数)
SWP_NOSIZE(&H1)
不改变窗口尺寸(即忽略CxCy参数)
SWP_NOREDRAW(&H8) Do not remove the image of the window in its former position from the screen. In other words,leave behind a ghost image of the window in its old position
SWP_NOZORDER(&H4)
不改变窗口听Z轴位置(即忽略hWndInsertAfter参数)
SWP_SHOWWINDOW(&H40)
显示窗口

例子:

SetWindowPos(this.Handle, (IntPtr)(0), 1024, 0, 1024, 768, 0x0040);

 

this.Handle  要移动的是当前窗体;

(IntPtr)(0)  将窗口放在Z轴的前面,即所有窗口的前面;

1024, 0,   由于电脑显示屏是1024*768,要显示在电视上就从电脑显示屏的右边开始(开始坐标)

1024, 768,  在电视上的分辨率是1024*768

0x0040     显示窗口

 

方法二:微软自带的Screen类

不需要任何引用直接添加代码

this.FormBorderStyle = FormBorderStyle.None;

this.DesktopBounds = Screen.AllScreens[1].Bounds;

这两行代码表示将一个无边框的窗体全屏显示在第二个窗体上。

 

获取所有窗体的显示比率:

Screen[] s = Screen.AllScreens;

ScreensRect = new Rectangle[s.Length];

for (int i = 0; i < s.Length; i++)

{

    ScreensRect[i] = s[i].WorkingArea;

}

获取第二屏的坐标:

int iX = ScreensRect[1].X;

int iY = ScreensRect[1].Y;

 

注:部分内容引自http://hi.baidu.com/libeiqi1201/blog/item/aa8322fececbbf3c5d600816.html

出处:https://blog.csdn.net/hejialin666/article/details/6057551


这篇文章主要介绍了Winform窗口实现多显示屏显示的2种方法,本文直接给出了实现代码,并对其中的一些重要参数做了解释,需要的朋友可以参考下。

一台主机连接了2台显示器(2个显卡),要求一个程序的两个窗体在不同的显示器上显示:显示器1 显示From1,显示器2  显示From2。代码及说明如下:

Form1不需要变更代码,From2添加如下代码:

// 方法一:

From2 frm2 = new From2();
if (Screen.AllScreens.Count() != 1)
{
  frm2.Left = Screen.AllScreens[0].Bounds.Width;
  frm2.Top = 0;
  frm2.Size = new System.Drawing.Size(Screen.AllScreens[1].Bounds.Width, Screen.AllScreens[1].Bounds.Height);
}
// 方法二:
   this.Left = ((Screen.AllScreens[1].Bounds.Width - this.Width) / 2);
   this.Top = ((Screen.AllScreens[1].Bounds.Height - this.Height) / 2);
   this.Size = new System.Drawing.Size(Screen.AllScreens[1].Bounds.Width, Screen.AllScreens[1].Bounds.Height);

说明:

获取当前系统连接的屏幕数量: Screen.AllScreens.Count();

获取当前屏幕的名称:string CurrentScreenName = Screen.FromControl(this).DeviceName;

获取当前屏幕对象:Screen CurrentScreen = Screen.FromControl(this);

获取当前鼠标所在的屏幕:Screen CurrentScreen = Screen.FromPoint(new Point(Cursor.Position.X, Cursor.Position.Y));

出处:http://www.jb51.net/article/67263.htm

原文地址:https://www.cnblogs.com/mq0036/p/6298367.html