Powershell:通过标题调整窗口大小,而不是通过进程id



我想听听你对这个问题的看法:我的桌面上有两个Citrix Receiver/Workspace会话,我想根据它们的窗口标题来调整窗口的大小。

我知道通过进程id执行此操作的解决方案,例如

Get-Process | Where-Object {$。名称-eq 'CDVIEWER' -和$。MainWindowTitle -like 'Window1'} | set-window -X 0 -y 0 -width3850 -height 1150 -passthru

问题是所有的Citrix工作空间客户端窗口具有相同的进程id。这导致的结果是,我只能调整前台的Citrix Windows的大小。

是否有一种方法来设置窗口大小的标题,而不是它的进程id?

谢谢,托马斯。

你需要使用从user32.dll导入的本地函数来访问各个窗口-我认为你不能单独从powershell中做到这一点。从上面的链接签出函数EnumChildWindows,GetWindowTextMoveWindow-这些是您所需功能的构建块。

过程类似于

  1. 获取MainWindowHandle-例如[System.IntPtr] $WindowHandle =(get-process -Name notepad).MainWindowHandle(但用于citrix进程)。

  2. 使用EnumChildWindows和上面的句柄来定位它的所有子窗口

  3. 遍历子窗口并使用GetWindowText找到所需的窗口(特别是它的句柄)。只看带有句柄的窗口0 -可能有多个其他无效或不可见的窗口。

  4. 使用MoveWindow来实际改变窗口的位置(使用上面的窗口句柄)。

我建议你搜索上面的每一个,以及如何从powershell执行,而不是试图自己将API调用移植到powershell。使用这些外部函数可能有点棘手,但它们要强大得多。

如果你自己写,总是用try…catch…最后要确保你的总是清理资源。Powershell不能用这些功能为你做到这一点。如果你打开它,关闭它,如果你分配内存,之后释放它等等。

我无法访问Citrix,但以上功能应该为您指明正确的方向。

最新更新