代码之家  ›  专栏  ›  技术社区  ›  mrid

在不同的屏幕上启动程序

  •  0
  • mrid  · 技术社区  · 7 年前

    我已经退房了:

    SetWindowPos not working on Form.Show()

    Launch an application and send it to second monitor?

    然而,这些解决方案似乎都不适合我。我想在另一台显示器上打开一个外部程序。

    这是我当前的代码:

     public const int SWP_NOSIZE = 0x0001;
     public const int SWP_NOZORDER = 0x0004;
     public const int SWP_SHOWWINDOW = 0x0040;
    
     [DllImport("user32.dll", SetLastError = true)]
     public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
    
    
     [DllImport("user32.dll")]
     public static extern bool UpdateWindow(IntPtr hWnd);
    
    
     Process application = new Process();
     application.StartInfo.UseShellExecute = false;
     application.StartInfo.FileName = ".......";
     if (application.Start())
     {
         Rectangle monitor = Screen.AllScreens[1].Bounds; // for monitor no 2
    
         SetWindowPos(
             application.MainWindowHandle,
             IntPtr.Zero,
             monitor.Left,
             monitor.Top,
             monitor.Width,
             monitor.Height,
             SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
                    
         UpdateWindow(application.MainWindowHandle); // tried even with application.Handle
     }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   41686d6564    7 年前

    首先,你不需要 UpdateWindow ,呼叫 SetWindowPos 可能就够了。您只需要确保创建了窗口句柄 . 只需在调用之前添加以下行 设置窗口位置

    application.WaitForInputIdle();
    

    如果 WaitForInputIdle() 不适合你,你可以尝试以下方法:

    while (application.MainWindowHandle == IntPtr.Zero)
    {
        await Task.Delay(100);
    }
    

    以下代码对我来说很好:

    Process application = new Process();
    application.StartInfo.UseShellExecute = false;
    application.StartInfo.FileName = "notepad.exe";
    if (application.Start())
    {
        application.WaitForInputIdle();
        /* Optional
        while (application.MainWindowHandle == IntPtr.Zero)
        {
            await Task.Delay(100);
        } */
    
        Rectangle monitor = Screen.AllScreens[1].Bounds; // for monitor no 2
    
        SetWindowPos(
            application.MainWindowHandle,
            IntPtr.Zero,
            monitor.Left,
            monitor.Top,
            monitor.Width,
            monitor.Height,
            SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
    }
    

    请注意,这只会设置窗口的位置,而不会设置其大小。如果你想改变大小,你需要删除 SWP_NOSIZE

    推荐文章