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);
        }
    }
}

アプリケーションは画面ごとに新しいインスタンスを作成しますが、メイン画面にのみ表示され、他の画面には表示されません。

4

1 に答える 1

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;

コマンド ラインでxとの値を渡し、それらを無視して、画面の高さを使用して x/y 値を設定します。すべての画面が同じ解像度で、水平または垂直に配置されている場合、これらのウィンドウはすべて、画面の可視部分の下 (または右) に配置されている可能性があります。y

また、画面が常に同じ順序で返されるという保証も見つからないため、値が別の画面を参照している可能性があります。Screen.AllScreensscreenNum


また、このコードが の呼び出しの前ではなく呼び出しの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

于 2012-06-22T08:06:21.410 に答える