我希望我的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);
}
}
}
我的应用程序会为每个屏幕创建一个新实例,但它只显示在我的主屏幕上,而不会显示在其他屏幕上。
答案 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;
您在命令行中传递x
和y
值,然后忽略它们并使用屏幕的 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
替换。