为每个屏幕创建一个app实例

时间:2012-06-22 07:49:19

标签: c# .net winforms

我希望我的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 个答案:

答案 0 :(得分: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值,然后忽略它们并使用屏幕的 width height 设置x / y值。如果所有屏幕的分辨率相同,并且水平或垂直排列,则所有这些窗口都可能位于屏幕任何可见部分的下方(或右侧)。

我也找不到任何保证 Screen.AllScreens将始终以相同的顺序返回屏幕,因此screenNum值可能会引用不同的屏幕。< / p>


我还希望看到此代码在调用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替换。