PowerShell脚本无法实现两个Edge窗口并排排列的问题求助
PowerShell脚本无法实现两个Edge窗口并排排列的问题求助
嗨,我帮你分析下这个问题哈~你的脚本现在能成功打开两个Edge窗口,但没法调整它们的位置和大小并排显示,核心问题出在用WPF的System.Windows.Window对象去操作外部应用窗口的思路上——WPF的Window类只能管控自己框架创建的窗口,完全管不到Edge这种原生Win32应用的窗口,所以你后面调整$win1.Width这些属性根本不会生效。
另外还有个小细节:你脚本里用到的Wait-ForWindowOpen函数如果没有提前定义的话,其实会报错,你说没看到错误可能是之前有这个函数但没贴出来,但就算拿到了窗口句柄,后续的WPF操作逻辑还是走不通的。
正确的解决方案:调用Windows原生API控制窗口
我们需要通过Windows原生的窗口管理API(比如SetWindowPos)来直接操作Edge窗口的位置和大小,下面是修正后的完整脚本,我会附上详细注释:
# 定义调用Windows API需要的P/Invoke函数 Add-Type @" using System; using System.Runtime.InteropServices; public class WindowUtils { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } } "@ # 定义SetWindowPos的参数常量(控制窗口行为) $SWP_SHOWWINDOW = 0x0040 $HWND_TOP = [IntPtr]0 # 打开两个Edge窗口 Write-Host "正在打开Edge窗口..." Start-Process -FilePath "msedge.exe" Start-Process -FilePath "msedge.exe" # 等待窗口加载(根据你的系统情况调整等待时间) Start-Sleep -Seconds 5 # 获取所有Edge的窗口句柄(过滤掉无效的空句柄) $edgeWindows = Get-Process msedge | ForEach-Object { if ($_.MainWindowHandle -ne [IntPtr]0) { $_.MainWindowHandle } } # 确保我们拿到了至少两个窗口句柄 if ($edgeWindows.Count -lt 2) { Write-Error "未找到足够的Edge窗口,请关闭所有Edge窗口后重试" exit } # 获取主屏幕的分辨率 $screenWidth = [System.Windows.SystemParameters]::PrimaryScreenWidth $screenHeight = [System.Windows.SystemParameters]::PrimaryScreenHeight $halfWidth = [Math]::Floor($screenWidth / 2) # 调整第一个窗口:左侧,宽度为屏幕一半,高度满屏 [WindowUtils]::SetWindowPos( $edgeWindows[0], $HWND_TOP, 0, # X坐标:屏幕最左侧 0, # Y坐标:屏幕最顶部 $halfWidth, # 窗口宽度 $screenHeight, # 窗口高度 $SWP_SHOWWINDOW ) # 调整第二个窗口:右侧,宽度为屏幕一半,高度满屏 [WindowUtils]::SetWindowPos( $edgeWindows[1], $HWND_TOP, $halfWidth, # X坐标:屏幕中间位置 0, # Y坐标:屏幕最顶部 $halfWidth, # 窗口宽度 $screenHeight, # 窗口高度 $SWP_SHOWWINDOW ) Write-Host "已完成两个Edge窗口的并排排列!"
脚本关键说明:
- P/Invoke函数定义:通过
Add-Type引入Windows的user32.dll中的API,这些是专门用来控制外部窗口的原生接口; - 窗口句柄获取:通过
Get-Process msedge提取每个Edge进程的主窗口句柄,避免了Edge进程复用导致的句柄错误; - 屏幕尺寸计算:用
SystemParameters自动获取主屏幕分辨率,计算出一半宽度,确保窗口完美适配你的屏幕; - SetWindowPos调用:这个API直接修改窗口的位置和大小,参数里的
SWP_SHOWWINDOW确保窗口正常显示,HWND_TOP让窗口处于顶层。
注意事项:
- 如果你的Edge已经有打开的窗口,新窗口可能会复用现有进程,导致获取的窗口句柄不对,建议测试前先关闭所有Edge窗口;
- 可以根据自己的系统加载速度调整
Start-Sleep的等待时间,确保窗口完全加载后再调整位置; - 如果你不想让窗口满屏高度,只需要把
$screenHeight改成你想要的数值即可。
备注:内容来源于stack exchange,提问作者Maslie
相关产品推荐
相关产品推荐

