美文网首页unity
2019-08-02 unityC#多显示器转换的两种方法——S

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

作者: Nmao | 来源:发表于2019-08-02 12:02 被阅读3次

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

两种显示方法:

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#多显示器转换的两种方法——S

    实现多屏显示目的:一般情况下是一个电脑显示屏,外接一个电视显示屏。在电脑上显示的一个窗体需要单独(没有窗体头,没有...

  • 如何将clusterProfiler富集结果中entrezID转

    两种方法将难懂的entrezID转换为geneSymbol 首先加载相关的R包 第一种方法:直接使用DOSE::s...

  • 玩转CAD转换,PDF转CAD你值得拥有!

    还在为图纸转换问题头疼吗?今天分享给大家两种CAD转换方法,教你轻松玩转CAD转换。 方法一:本地版 所需工具: ...

  • 计算机图形学算法-光栅图形学

    直线段的扫描转换算法(一) 1.1 直线段扫描转换算法概述: 光栅显示器屏幕上的直线核心方法:用离散像素点逼近直线...

  • 【JavaScript中的类型转换】

    字符串转换为数字的方法 字符串转换为数字的方法可以分为两种,一个是显式转换,一种是隐式转换。 显式转换是通过函数的...

  • js技巧

    DOM与javascript转换 query对象转换为DOMD对象, jquery提供两种方法将jquery对象转...

  • php的数据类型的转换和运算符

    主要分为两种,自动转换和强制类型转换,也就是显式转换和隐式转换,自动转换用的多 php中强制类型转换 在php中的...

  • 开心踩坑

    2021.11.22问题:想将 ES6 转换为其他版本的 JS方法:1.搜索在线的转换工具找到两种,尝试转换,发现...

  • UIImage 转 NSData调研

    一、转换方法介绍 目前系统提供的方法中,有两种UIImage对象转NSData对象的方法第一种 第二种 二、转换方...

  • js-字符串与JSON

    字符串方法,数组的方法,字符串与数组相互转换,回文,JSON 1.使用数组拼接出如下字符串 2.写出两种以上声明多...

网友评论

    本文标题:2019-08-02 unityC#多显示器转换的两种方法——S

    本文链接:https://www.haomeiwen.com/subject/kmxldctx.html