2019-08-02 unityC#多显示器转换的两种方法——SetWindowPos,Screen

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

两种显示方法:

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) 不移动窗口(即忽略X和Y参数)

SWP_NOSIZE(&H1) 不改变窗口尺寸(即忽略Cx和Cy参数)

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;

你可能感兴趣的:(2019-08-02 unityC#多显示器转换的两种方法——SetWindowPos,Screen)