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


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

兩種顯示方法:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM