實現多屏顯示目的:一般情況下是一個電腦顯示屏,外接一個電視顯示屏。在電腦上顯示的一個窗體需要單獨(沒有窗體頭,沒有窗體邊框)顯示在電視上,並且還能再拉回電腦顯示屏顯示。
兩種顯示方法:
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