在不同的屏幕上启动程序

问题描述 投票:0回答:1

我已经检查过了:

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
 }
c# winforms pinvoke setwindowpos
1个回答
1
投票

首先,你不需要UpdateWindow,调用SetWindowPos可能已经足够了。您只需确保创建窗口句柄(因为正在启动该过程)。只需在调用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标志。

© www.soinside.com 2019 - 2024. All rights reserved.