2012-06-22 53 views
1

我希望我的WinForms應用程序爲每個屏幕創建一個自己的實例並顯示在該屏幕上。 我有以下代碼:爲每個屏幕創建一個應用實例

主要形式有:

class MainForm 
{ 
    public MainForm() 
    {   
     string[] args = Environment.GetCommandLineArgs(); 

     foreach (string arg in args) 
     { 
      if (arg == "TakeOverAllScreens") { TakeOverAllScreens(); } 
      if (arg.StartsWith("Screen|")) 
      { 
       string[] s; 
       s = arg.Split('|'); 
       int xPos , yPos, screenNum ; 
       int.TryParse(s[1], out xPos); 
       int.TryParse(s[2], out yPos); 
       int.TryParse(s[3], out screenNum); 
       Screen[] sc; 
       sc = Screen.AllScreens; 
       this.Left = sc[screenNum].Bounds.Width; 
       this.Top = sc[screenNum].Bounds.Height; 
       this.StartPosition = FormStartPosition.Manual; 
      } 
     } 

     InitializeComponent(); 
    } 

    private void MainForm_Load(object sender, EventArgs e) 
    { 
     this.TopMost = true; 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.WindowState = FormWindowState.Maximized; 
    } 
} 

TakeOverAllScreens形式:

private void TakeOverAllScreens() 
{ 
    int i = 0; 
    foreach (Screen s in Screen.AllScreens) 
    { 
     if (s != Screen.PrimaryScreen) 
     { 
      i++; 
      Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y+"|" + i); 
     } 
    } 
} 

我的應用程序,爲每個畫面創建一個新的實例,但它只是我的主屏幕上顯示並不顯示在其他屏幕上。

回答

1

這看起來可疑:

int.TryParse(s[1], out xPos); 
int.TryParse(s[2], out yPos); 
int.TryParse(s[3], out screenNum); 
Screen[] sc; 
sc = Screen.AllScreens; 
this.Left = sc[screenNum].Bounds.Width; 
this.Top = sc[screenNum].Bounds.Height; 

您通過xy值橫跨在命令行上,然後忽略它們,並使用寬度高度屏幕設置你的x/y值。如果所有屏幕的分辨率相同,並且水平或垂直排列,則可能所有這些窗口都位於屏幕任何可見部分的下方(或右側)。

我也找不到任何保證Screen.AllScreens總是返回以相同的順序屏幕,所以screenNum值可以參照不同的屏幕。


我也更願意看到這個代碼通話後出現的InitializeComponents,而不是之前,所以你知道,任何設計師組屬性會被你的代碼重寫,而不是相反。


所以,我的代碼是:

public MainForm() 
{ 
    InitializeComponent(); 

    string[] args = Environment.GetCommandLineArgs(); 

    foreach (string arg in args) 
    { 
     if (arg == "TakeOverAllScreens") { TakeOverAllScreens(); } 
     if (arg.StartsWith("Screen|")) 
     { 
      string[] s; 
      s = arg.Split('|'); 
      int xPos, yPos, screenNum; 
      int.TryParse(s[1], out xPos); 
      int.TryParse(s[2], out yPos); 
      this.Left = xPos; 
      this.Top = yPos; 
      this.StartPosition = FormStartPosition.Manual; 
     } 
    } 
} 

和:

private void TakeOverAllScreens() 
{ 
    foreach (Screen s in Screen.AllScreens) 
    { 
     if (s != Screen.PrimaryScreen) 
     { 
      Process.Start(Application.ExecutablePath, "Screen|" + s.Bounds.X + "|" + s.Bounds.Y); 
     } 
    } 
} 

當然,TryParse電話是毫無意義的,可以通過Parse更換,如果你只是打算忽略返回值。

+0

太棒了!有用! :d。我認爲這個問題試圖指定屏幕。 'this.Left = sc [screenNum] .Bounds.Width;'而不是僅僅使用'this.Left = xPos;'謝謝你! –

相關問題