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

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

两种显示方法:windows

一、方法一:调用API
api

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

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

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

 

解释spa

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

 

函数参考:

 英文官方说明:SetWindowPos function3d

英文很差的就看看中文:百度百科SetWindowPoscode

 

表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

相关文章
相关标签/搜索