Winform程序實現多顯示屏、多屏幕顯示的2種方法

實現多屏顯示目的:通常狀況下是一個電腦顯示屏,外接一個電視顯示屏。在電腦上顯示的一個窗體須要單獨(沒有窗體頭,沒有窗體邊框)顯示在電視上,而且還能再拉回電腦顯示屏顯示。html

兩種顯示方法:windows

一、方法一:調用API
api

這種方法須要引微軟的user32.dll,不過在VS中已經自動引過了,只須要加個外部引用函數

[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowPos", SetLastError = true)]ui

private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);this

 

解釋spa

SetWindowPos函數功能是將一個窗口在三維空間中移動,利用它,你能夠改變一個窗口的位置,甚至能夠在Z軸上改變(Z軸決定了一個窗口和其它窗口的先後關係),你還能夠改變窗口的尺寸。爲了實現TopMost類型的窗口,咱們只需調用該函數,將窗口放在全部窗口的前面並永遠保持在最前面便可。.net

 

函數參考:

 英文官方說明:SetWindowPos function3d

英文很差的就看看中文:百度百科SetWindowPoscode

 

表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)
不移動窗口(即忽略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     顯示窗口

 

方法二:微軟自帶的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

相關文章
相關標籤/搜索