C#多显示器转换的两种方法——SetWindowPos,Screen

来源:互联网 发布:ubuntu 16.04 wingide 编辑:程序博客网 时间:2024/06/10 17:36

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

两种显示方法:

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类型的窗口,我们只需调用该函数,将窗口放在所有窗口的前面并永远保持在最前面即可

 

1 SetWindowPos函数的参数解释

参数名 参数含义
hwnd
要移动的窗口的句柄(可以用窗体的hwnd属性)
hWndInsertAfter
关于如何在Z轴上放置窗口的标记(具体见表2
x
相当于窗口的Left属性
y
相当于窗口的Top属性
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       显示窗口

 

2.Net自带的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

原创粉丝点击