C# 在特定屏幕上启动进程

C# 在特定屏幕上启动进程,c#,windows,process,pinvoke,multiple-monitors,C#,Windows,Process,Pinvoke,Multiple Monitors,我正在编写一个在特定屏幕上打开程序的小工具,这样我就可以设置监控屏幕(1台机器有2个屏幕)在一夜之间重新启动,并让它在启动时将监控网页恢复到正确的屏幕。我想通过使用.NET的System.Diagnostics.Process类来实现这一点 我已经看到可以打开一个进程,然后使用p/Invokes()将其移动到某个地方, 但是,我想在应用程序打开之前设置目标屏幕,这样,例如,Kiosk模式下的Chrome就可以通过此设置正确启动 有人知道如何做到这一点吗?不久前,我们使用user32.dll的Se

我正在编写一个在特定屏幕上打开程序的小工具,这样我就可以设置监控屏幕(1台机器有2个屏幕)在一夜之间重新启动,并让它在启动时将监控网页恢复到正确的屏幕。我想通过使用.NET的System.Diagnostics.Process类来实现这一点

我已经看到可以打开一个进程,然后使用p/Invokes()将其移动到某个地方, 但是,我想在应用程序打开之前设置目标屏幕,这样,例如,Kiosk模式下的Chrome就可以通过此设置正确启动


有人知道如何做到这一点吗?

不久前,我们使用user32.dll的
SetWindowPos
创建了一个类似的解决方案。虽然它不会在所需的窗口上打开程序,但需要几毫秒才能打开,因此这对于您的需求来说并不是一个真正的问题

您可以查看以下要点:

请特别注意
显示
类:

    private void ShowAppOnDisplay(App app)
    {
        SetWindowPos(app.Process.MainWindowHandle, 0, _screen.WorkingArea.Left, _screen.WorkingArea.Top, _screen.WorkingArea.Width, _screen.WorkingArea.Height, SWP_SHOWWINDOW);
    }

如果你需要更多的帮助,请告诉我

这看起来像是您想要做的事情:[Link][1][1]:@LueTm,如果您是编写必须启动的应用程序的人,那么它就可以工作,但在这里,我试图操纵一个我正在启动的应用程序(例如Chrome)以显示在特定的监视器上。System.Diagnostics.Process似乎没有这样操作窗口的功能(尽管我可能忽略了一些东西)。我认为不使用P/Invoke是不可能的。但是有一些工具可以满足您的需要:@LueTm我不介意是否必须使用P/Invoke,问题更多的是在窗口打开之前必须设置窗口位置,这在我看到的传统P/Invoke MoveWindow函数中是不可能的。至于工具,我已经看到有可用的工具,但我更喜欢自己做;如果有人写了一个程序来做这件事,那一定是可能的。为什么打开窗口后改变窗口的位置如此重要?不应该超过一秒钟就可见…这对启动时已经全屏显示的程序有效吗?我以为你不能移动程序,比如Chrome在kiosk模式下,当它们已经是全屏的时候。。代码看起来真的很不错!正在尝试是否可以在我的应用程序中使用你的代码。是的,我们实际上在kiosk模式下在chrome上使用了它!我们遇到的唯一警告是windows的安全“功能”。如果用户通过鼠标或键盘与任何窗口进行任何交互,应用程序将失去访问窗口句柄的权限,尽管它是创建者。我让它工作!不过我还有一只奇怪的虫子!仅当我在SetWindowPos上设置断点或执行Thread.Sleep(即使只有1ms)时,窗口才会移动。尽管如此,我还是认为答案是正确的,因为代码似乎很有用:)这可能是将窗口句柄分配给进程所需的时间。:)嗯,在进一步的实验中,它拒绝移动全屏Chrome Kiosk窗口。即使我做了Thread.Sleep(5000)之类的事情,如果我试图在程序完全启动之前移动它,它也无法移动它,这就是早期错误的原因。