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

两种显示方法:

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) 不移动窗口(即忽略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     显示窗口

方法二:微软自带的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

Winform程序实现多显示屏、多屏幕显示的2种方法的更多相关文章

  1. 解决C# WINFORM程序只允许运行一个实例的几种方法详解

    要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现: 方法一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例. 把program.cs文件里的Main()函数改为如下代码: u ...

  2. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  3. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...

  4. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  5. Win7,Vista UAC下应用程序标注为“需要管理员权限”的四种方法(可以修改注册表)

    [转]Vista UAC下应用程序标注为“需要管理员权限”的四种方法 在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上 ...

  6. 【转】delphi程序只允许运行一个实例的三种方法:

    一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...

  7. Visual Studio 编译Winform程序不生成.vshost.exe和.pdb文件的方法

    问题:使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost.exe」和「.pdb」的文件. 先解释一下各个文件的作用: .pdb文件: ...

  8. Vista UAC下应用程序标注为“需要管理员权限”的四种方法

    在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上加上一个盾牌标记.因此很容易看出来. 其次,如果UAC有效的话,管理员 ...

  9. 小程序跨页面传递data数据的三种方法

    Q:小程序怎么把页面data里的数据传到另外的页面? 或者小程序怎么吧表单里的数据传到另外的页面?A:1.可以使用url传递数据. 例如在A页面中传递数据,需要注意的是,wx.switchTab中的u ...

随机推荐

  1. shell 字符串处理汇总(查找,替换等等)

    字符串: 简称“串”.有限字符的序列.数据元素为字符的线性表,是一种数据的逻辑结构.在计算机中可有不同的存储结构.在串上可进行求子串.插入字符.删除字符.置换字符等运算. 字符: 计算机程序设计及操作 ...

  2. php自定义函数: 加密下载地址

    function getdownurl($downurl, $extime = "3600", $serverid = 1) { if (empty($downurl)) { re ...

  3. php在web端播放amr语音(如微信语音)

    在使用微信JSSDK的上传下载语音接口时,发现一个问题: 下载的语音在iPhone上不能播放,测试了之后原因竟然是: 微信接口返回的音频内容是amr格式的,但iPhone不支持播放此类型格式. 那么转 ...

  4. Redis通过PUBLISH / SUBSCRIBE 等命令实现了订阅与发布模式

    # 切换目录 [root@localhost /]# cd /opt/redis-4.0.10 # 启动客户端 -p 指定端口 [root@localhost ~]# redis-cli -p 638 ...

  5. C#线程使用学习

    线程的入口函数可以不带输入参数,也可以带输入参数: form1.cs using System; using System.Collections.Generic; using System.Comp ...

  6. shell基础part3

    shell基础 一.环境变量配置文件简介 1.source命令的作用就是将环境变量配置文件强制生效,其格式为: source 环境变量配置文件或者 . 环境变量配置文件 2.环境变量配置文件中主要是定 ...

  7. LeetCode:三个数的最大乘积【628】

    LeetCode:三个数的最大乘积[628] 题目描述 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1 ...

  8. iOS 尝试用 block 闭包 去代替delegate 实现方法

    通常都是这样创建alert 再加一个代理 // 创建一个UIAlertView并显示出来 UIAlertView *alertview = [[UIAlertView alloc] initWithT ...

  9. autoplay移动端不能自动播放

    本文总结自:https://stackoverflow.com/questions/12496144/can-you-autoplay-html5-videos-on-the-ipad 首先,自动播放 ...

  10. nginx 启动/停止/重启

    启动: -c filename   : set configuration file (default: conf/nginx.conf) [root@LinuxServer sbin]# /usr/ ...