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)。
但是基本逻辑是相同的:
查找要使用的Windows句柄。您可以在Timwi提到的一般情况下使用FindWindow或EnumWindows 。但是,如果您的过程很简单并且只有一个主窗口,那么它就是:
var hndl = proc.MainWindowHandle
Run Code Online (Sandbox Code Playgroud)有了手柄,您可以使用以下功能。您只需要提供显示编号(从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。
归档时间: |
|
查看次数: |
31538 次 |
最近记录: |