关于C#多屏幕显示器编程

转载 2006年05月17日 08:48:00

在窗口的中间有一个System.Windows.Forms.PictureBox控件(该控件区域的面积为所在窗口的1/4),当该控件的大部分区域落在其中一台显示器时,在另一台显示器将不显示该控件,(该PictureBox控件将移动到主显示器所在的窗口区域)。
是否应该调用GetMonitorInfo?

首先你需要知道一个屏幕是如何分割成多个显示器显示的,即每个显示器显示多大region。
而在初始化picturebox的时候,你可以通过
Screen.PrimaryScreen.Bounds
来获得屏幕大小,至于控件的位置,你可以先转换到屏幕坐标,然后按照前面获得比例尺寸(一个屏幕是如何分割成多个显示器显示的,即每个显示器显示多大region),最后进行判断处理。

 

多屏幕编程简单么?
比如分辨率1024*768
第一个屏幕就是0~1024,第二个屏幕就是1025~2048,....
如果你要把某一画面显示在第二个屏幕。。。只要把它的x,y位置即可。。。

 

受了Knight94(愚翁)的启发,做了个测试,可以实现我需要的效果了,谢谢Knight94。
测试代码如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication12
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private int tmpx = 0;
private int tmpy = 0;
private System.Windows.Forms.PictureBox pictureBox1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

System.Drawing.Rectangle[] ScreensRect;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.SystemColors.HotTrack;
this.pictureBox1.Location = new System.Drawing.Point(120, 88);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(248, 176);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(504, 357);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Form1";
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
this.Load += new System.EventHandler(this.Form1_Load);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.tmpx = e.X;
this.tmpy = e.Y;
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.form1_MouseMove);

}

private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.MouseMove -= new System.Windows.Forms.MouseEventHandler(this.form1_MouseMove);

System.Drawing.Rectangle pictureBox1Rect=Screen.GetWorkingArea(pictureBox1);

for(int i=0;i<ScreensRect.Length;i++)
{
    if(ScreensRect[i].X==pictureBox1Rect.X && ScreensRect[i].Y==pictureBox1Rect.Y)
this.Location=new Point(ScreensRect[i].X,pictureBox1Rect.Y);
}
//MessageBox.Show(" WorkingArea:" + re.ToString());
}
private void form1_MouseMove(object sender, MouseEventArgs e)
{
this.Location = new System.Drawing.Point(this.Location.X + e.X - this.tmpx, this.Location.Y + e.Y - this.tmpy);
}

private void Form1_Load(object sender, System.EventArgs e)
{
Screen[] s=Screen.AllScreens;
ScreensRect=new Rectangle[s.Length];
for(int i=0;i<s.Length;i++)
{
ScreensRect[i]= s[i].WorkingArea;
}
}
}
}

C#多屏幕显示器编程

在窗口的中间有一个System.Windows.Forms.PictureBox控件(该控件区域的面积为所在窗口的1/4),当该控件的大部分区域落在其中一台显示器时,在另一台显示器将不显示该控件,(该...
  • proglovercn
  • proglovercn
  • 2015年03月27日 11:43
  • 746

c#捕获当前屏幕

编程思路(API 编程): 先调用 GetForegroundWindow 获取当前活动程序窗口句柄,然后调用 GetWindowDC 获取窗口的设备句柄(或 GetDC 函数),调用 BitBl...
  • ghevinn
  • ghevinn
  • 2013年03月29日 18:45
  • 1320

屏幕尺寸,分辨率,像素,PPI之间到底什么关系?

今天我给大家来讲讲这几个咱们经常打交道的词到底啥意思,以及他们之间到底有什么关系。这篇文章是我花了一个下午从N多篇文章里提炼出的一个白话版,保证让你看得懂。 咱们从手机开...
  • lishimin1012
  • lishimin1012
  • 2016年12月30日 09:38
  • 625

(分享)win10下双显示屏独立设置不同缩放率的方法

win10下双显示屏独立设置不同缩放率的方法
  • chenlycly
  • chenlycly
  • 2017年06月08日 18:10
  • 1827

双屏,多屏情况下,获取屏幕的坐标

项目需要,要在不同的屏幕中显示不同的内容。 我wai
  • q1177660557
  • q1177660557
  • 2014年08月03日 15:28
  • 1674

VC实现多屏显示

直接贴源码吧,vc2008调试通过。只贴多屏显示相关操作类。 h文件如下: /********************************************** Copyright(...
  • dominating_
  • dominating_
  • 2016年11月21日 14:51
  • 936

C#窗体自适应显示器大小

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W...
  • woofilian
  • woofilian
  • 2016年12月08日 14:43
  • 588

EnumDisplayMonitors—多屏显示的实现

在编程中要用到相关的结构体和函数,这些都已经包装好,在multimom.h头文件中,该头文件VC自带有。在要用的的地方包含该头文件,注意在包含前面要加上一句宏定义:#define COMPILE_MU...
  • sunnylion1982
  • sunnylion1982
  • 2014年04月11日 09:11
  • 7074

关闭显示器电源SendMessage函数调用方法

当然在台式机上,直接关闭显示器电源即可。在笔记本上,利用键盘的FN快捷键,只能关闭屏幕背光,不能关掉主板给屏幕的信号输出。仔细看仍然会看到暗淡的桌面。 在桌面显示属性的“电源管理”里面,我们可以调整电...
  • sTeVes
  • sTeVes
  • 2014年04月03日 16:17
  • 2209

关于获取多个屏幕分辨率以及进行一些设置

Windows下提示显示器信息主要通过两个函数实现。一个是EnumDisplayDevices(), 另一个是EnumDisplayMonitors(). EnumDisplayDevices()枚举...
  • swartz_lubel
  • swartz_lubel
  • 2017年02月04日 23:13
  • 1389
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于C#多屏幕显示器编程
举报原因:
原因补充:

(最多只允许输入30个字)