我有一个Winform应用程序,它接收一个命令行参数,指定它是否会通过I-Omega USB双显示器连接器显示在第二个显示器的主监视器上。
该应用程序在笔记本电脑上运行并使用两台显示器。 1.第一台显示器只连接到笔记本电脑的VGA端口。我运行“MyApplication.exe 1” 2.第二台显示器通过USB双显示器VGA端口连接。我运行第二个实例“MyApplication.exe 2”
我可以通过使用Screen.AllScreens并更改Form的位置来强制应用程序的第二个实例转到第二个montior。如果笔记本电脑折叠,我在笔记本电脑的电源设置中指定不要使用待机或关机显示器。当我关闭笔记本电脑的显示器时,应用程序的两个实例都保留在各自的显示器上。但是当我重新打开笔记本电脑时,第二个实例会移动第一个屏幕。
我的问题是在.NET中有一个监视器打开事件吗?或者是否有其他设置将第二个实例保留到第二个监视器/屏幕?
我知道有一个WM_POWERBROADCAST事件但是,我已经将笔记本电脑设置为不睡觉。
答案 0 :(得分:1)
我能够通过Windows事件而不是使用计时器来做到这一点。基本上,计时器将检查具有所需屏幕的窗口的位置。如果它与所需的屏幕不匹配,我会再次调整位置以移动到所需的显示器。在检查左上角位置是否相等时,我添加了4(WinXP)~8(Win7)像素的容差。处于最大化状态时,顶部和左侧位置变为(-4,-4)。在最小化状态下,我不检查位置。
我使用了上一个问题中的ShowOnMonitor方法: How do I ensure a form displays on the "additional" monitor in a dual monitor scenario?
private void autoAdjustPositionTimer_Tick(object sender, EventArgs e) {
if (WindowState == FormWindowState.Minimized)
{
return;
}
autoAdjustPositionTimer.Stop();
try
{
Screen[] sc;
sc = Screen.AllScreens;
int showOnMonitor = ExpectedMonitorIndex; // i.e. 1
if (showOnMonitor >= sc.Length)
{
showOnMonitor = 0;
}
int offsetTolerance = 8;
// Check the top left position only
int xDiff = Math.Abs(Location.X - sc[showOnMonitor].Bounds.Left);
int yDiff = Math.Abs(Location.Y - sc[showOnMonitor].Bounds.Top);
if (xDiff > offsetTolerance || yDiff > offsetTolerance){
// Method to move the position
ShowOnMonitor(showOnMonitor);
}
}
finally
{
autoAdjustPositionTimer.Start();
}
}