启动应用程序并将其发送到第二台显示器?

Dat*_*ase 25 c# multiple-monitors monitor

有没有办法在另一个屏幕上通过Process开始/午餐?

有人在这里问过,但没有答案.

注意:它不是我的应用程序中的表单,我问的是在另一个屏幕上运行外部程序!

Tim*_*mwi 26

由于窗口不是您的,因此您只能通过调用Windows API来移动它.你必须这样做:

  • 启动该过程.

  • 使用FindWindow检索的窗口句柄.如果窗口尚不存在,则该进程尚未创建它; 睡500码,然后再试一次.(但是不要进入无限循环;如果在合理的超时后找不到窗口,请停止.)

  • 使用SetWindowPos改变窗口的位置.

如果您不知道窗口的标题,则无法使用FindWindow.在这种情况下,

  • 启动该过程并通过检索获取进程句柄Process.Handle.

  • 使用EnumWindows检索所有窗口.对于每个窗口,用于GetWindowThreadProcessId检查它是否属于您的进程.如果没有窗口属于您的进程,请等待并继续尝试.

  • 使用SetWindowPos改变窗口的位置.

当然,您可以使用它Screen.AllScreens[n].WorkingArea来检索所需屏幕的位置和大小,然后您可以相对于该窗口定位窗口.


Han*_*son 10

首先使用以下方法获取第二台显示器的区域:

Rectangle area = Screen.AllScreens[1].WorkingArea;
Run Code Online (Sandbox Code Playgroud)

使用Windows API SetWindowPos移动它,使用从另一个进程的启动获得的Process.MainWindowHandle作为句柄.


小智 6

Timwi提供了一个非常有用的技巧,因此我决定创建一个Powershell脚本来调用具有这些功能的库,以便于使用,并共享解决方案。

我需要在启动时运行多个Chrome窗口,而GitHub上的解决方案正是针对此问题(相关问题:https : //superuser.com/a/901790/111424)。

但是基本逻辑是相同的:

  1. 查找要使用的Windows句柄。您可以在Timwi提到的一般情况下使用FindWindow或EnumWindows 。但是,如果您的过程很简单并且只有一个主窗口,那么它就是:

    var hndl = proc.MainWindowHandle
    
    Run Code Online (Sandbox Code Playgroud)
  2. 有了手柄,您可以使用以下功能。您只需要提供显示编号(从1开始)和句柄即可:

    public static bool MoveToMonitor(IntPtr windowHandle, int monitor)
    {
        monitor = monitor - 1;
        return WinApi.SetWindowPos(windowHandle, IntPtr.Zero, Screen.AllScreens[monitor].WorkingArea.Left,
            Screen.AllScreens[monitor].WorkingArea.Top, 1000, 800, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOREDRAW);
    }
    
    Run Code Online (Sandbox Code Playgroud)

您可以在http://www.pinvoke.net/上找到所有枚举和函数导入,或仅将我的代码复制到GitHub:https : //github.com/alex-tomin/Tomin.Tools.KioskMode