實現多屏顯示目的:通常狀況下是一個電腦顯示屏,外接一個電視顯示屏。在電腦上顯示的一個窗體須要單獨(沒有窗體頭,沒有窗體邊框)顯示在電視上,而且還能再拉回電腦顯示屏顯示。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) 不移動窗口(即忽略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