在不同的屏幕上启动程序



我已经签出了:

SetWindowPos 在 Form.Show(( 上不起作用

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

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

这是我当前的代码:

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
}

首先,你不需要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标志。

最新更新