【问题标题】:How to open process on dual monitor?如何在双显示器上打开进程?
【发布时间】:2014-12-05 04:05:37
【问题描述】:

我有一个 C# 应用程序,如果有多个屏幕,它应该在第二个屏幕上打开一个进程。我只是无法让它工作。有什么想法吗?

Array screens = Screen.AllScreens;
if (screens.Length > 1)
{
    // open in the second monitor
}
else
{
    System.Diagnostics.Process.Start(InputData);
}

它应该与else 中的数据相同,但只需在现在为空的if 中的第二个监视器上打开它。

【问题讨论】:

  • 什么类型的应用程序 wpf 或 winforms
  • 这是一个winforms应用程序
  • 在发送到本机 API CreateProcess 的启动信息中指定此项。并希望其他程序不要。如果没有,在程序启动后找到主窗口的句柄并调用SetWindowPos移动窗口。但最好的解决方案是更改另一个程序,即您正在启动的程序。
  • 一些对winform定位有用的想法:stackoverflow.com/questions/10733165/…

标签: c# winforms monitor


【解决方案1】:

没有标准的方法来指定应用程序在您启动时将出现在哪个屏幕上。但是,您可以:

  • 在启动的应用程序本身中处理它(当然如果你有它的代码)
  • 在进程启动后找到主窗口的句柄,并使用 Win32 互操作将其移动到第二个屏幕

【讨论】:

  • 嗯,CreateProcess 有启动信息参数,但许多程序忽略了它
  • @DavidHeffernan,你是说 ProcessStartInfo 吗?它不允许您指定屏幕,是吗?
  • 不,我的意思是CreateProcess的启动信息参数。该非托管 Win32 API 的倒数第二个参数。
  • @DavidHeffernan,啊,我不知道。不过,它似乎没有被彻底记录下来……可惜它没有通过 ProcessStartInfo 公开。
【解决方案2】:

您可以通过更改输入过程的 MainForm 来实现这一点,如下所示

public Form1()
        {
            this.StartPosition =FormStartPosition.Manual;
            InitializeComponent();

            Screen sndSc = Screen.AllScreens[1];

            if (sndSc.Primary)
            {
                sndSc = Screen.AllScreens[0];            
            }
            this.Height = sndSc.WorkingArea.Height;
            this.Width = sndSc.WorkingArea.Width; 
            this.Location = sndSc.WorkingArea.Location;   
        }

【讨论】:

    【解决方案3】:

    在定位窗口时,您应该做同样的事情。

    要在任何监视器上显示窗口,您应该根据该监视器的坐标重新定位它。

    假设您有两台显示器,结果均为 1920x1080,并且它们并排排列。在这种情况下,要在第二个屏幕上显示表单,您必须将表单的 X 坐标(或 Left 属性,我猜)设置为大于 1920。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2020-01-10
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多