You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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窗口的并排排列!"

脚本关键说明:

  1. P/Invoke函数定义:通过Add-Type引入Windows的user32.dll中的API,这些是专门用来控制外部窗口的原生接口;
  2. 窗口句柄获取:通过Get-Process msedge提取每个Edge进程的主窗口句柄,避免了Edge进程复用导致的句柄错误;
  3. 屏幕尺寸计算:用SystemParameters自动获取主屏幕分辨率,计算出一半宽度,确保窗口完美适配你的屏幕;
  4. SetWindowPos调用:这个API直接修改窗口的位置和大小,参数里的SWP_SHOWWINDOW确保窗口正常显示,HWND_TOP让窗口处于顶层。

注意事项:

  • 如果你的Edge已经有打开的窗口,新窗口可能会复用现有进程,导致获取的窗口句柄不对,建议测试前先关闭所有Edge窗口;
  • 可以根据自己的系统加载速度调整Start-Sleep的等待时间,确保窗口完全加载后再调整位置;
  • 如果你不想让窗口满屏高度,只需要把$screenHeight改成你想要的数值即可。

备注:内容来源于stack exchange,提问作者Maslie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:37:33