使用本机Windows 10工具(例如:PowerShell 5.1)

sdnqo3pr  于 2023-08-07  发布在  Windows
关注(0)|答案(1)|浏览(124)

有多个MS Edge窗口打开。
x1c 0d1x的数据
我的PowerShell脚本首先查找所有MS Edge进程及其ID。然后,它使用Start-Process 'msedge' cmdlet在WebApp模式下的新窗口中打开简单的HTML,即创建一个新的MS Edge进程,该进程会立即将其ID更改为我未知的ID。



我觉得这对我来说不是问题。让我们将旧的MS Edge进程列表与新的列表进行比较,从而找到新的进程。说到做到。



但我又遇到了另一个问题。当我关闭MS Edge WebApp窗口时,一个完全不同的随机MS Edge进程结束。



它是如何工作的?
如何使用PowerShell 5.1跟踪MS Edge WebApp窗口的进程?
非常重要:我需要使用内置的Windows 10工具来完成该任务。我无法使用第三方库!

  • 谢谢-谢谢
yzuktlbb

yzuktlbb1#

  • 正如Mathias所指出的,* tab *(甚至 windows)和msedgeprocesses 之间没有一对一的关系。
  • 此外,当您使用msedge.exe启动一个新选项卡时,通常会使用一个 transient 进程,该进程将委托给一个 * 预先存在的 * msedge进程,然后退出;因此:
  • 使用Start-Process-PassThru开关获取 * 直接 * 启动的进程将 * 不会 * 帮助您。
  • 类似地,检查用于启动正在运行的msedge进程的 * 命令行 * 并不能 * 反映打开的选项卡的URL。
  • 事实上,似乎只有一个 * 进程负责管理 * 所有 * 打开的Edge窗口,包括通过--app=<url>--new-window CLI参数以Web应用程序模式打开的窗口,并且,从Microsoft Edge v115开始,该进程的命令行是:
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --no-startup-window /prefetch:5

字符串

  • 此外,此进程在Get-Process输出的System.Diagnostics.Process示例的.MainWindowTitle属性中报告的内容(最终通过GetWindowText() WinAP函数检索)对应于 whatever window was most recently activeactive tab 的标题,甚至该选项卡的标题本身也会根据当前显示的页面而更改-有关详细信息,请参阅底部部分。

从以上可以得出:

  • 您无法识别一个 * 进程 独家 * 管理您的Web应用程序窗口,因为不存在这样的进程。
  • 据我所知,你能做的最好的事情就是找到你的web应用程序的 * 窗口 *,如下所示,但请注意,当且仅当 * 时,这个才能工作 *:
  • 您知道Web应用程序窗口的标题,
    • 和 * 没有 * 其他 * 具有相同标题的窗口,
    • 和 * 用户还没有导航到 * 不同的页面 *,因为这 * 改变了标题 *。
  • 此外,请注意,相关窗口类的名称Chrome_WidgetWin_1与其他基于Chromium的浏览器共享,因此也可以通过这种方式找到 Chrome Web应用程序窗口。

以下是标题为Google的Web应用程序窗口,自Microsoft Edge v115(基于 Chromium 的实现)起:

# The full window title of your Edge-based web-application window (case doesn't matter).
$windowTitle = 'Google'

# Use a P/Invoke call to find the window by class name and title,
# and returns its hWnd (window handle).
$hWndWebApp = 
  (Add-Type -NameSpace NS$PID -Name WindowHelper -PassThru  @'
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
'@)::FindWindow('Chrome_WidgetWin_1', $windowTitle)

# Display the result:
if (0 -eq $hWndWebApp) {
  Write-Warning ('No Edge-based web application window with current window title "{0}" found.' -f $windowTitle)
} else {
  'Edge-based web application window with window title "{0}" has hWnd 0x{1:x}' -f $windowTitle, $hWndWebApp
}

可选阅读:窗口管理Edge进程如何报告其 main 窗口标题:

  • 管理所有打开的Edge窗口的单个进程动态地报告其 * 主 * 窗口标题 *:
  • 在所有窗口(如果适用)中,* 当前或最近活动窗口 * 中的 * 活动 * 选项卡确定标题。
  • 标题基于该选项卡的标题,它本身是动态的,反映了当前显示的任何页面的标题。
  • 此主窗口标题反映在Get-Process输出的System.Diagnostics.Process示例的.MainWindowTitle属性中,并最终通过GetWindowText() WinAP函数检索。
  • 从系统的Angular 来看,实际的 * 窗口标题 *,即 *window对象 * 的标题栏文本(这里实际上是 * 隐藏的 *)可以与Edge GUI中显示给用户的 tab 标题 * 不同,因为它可能有一个 *dynamic后缀 *,结构如下(从Microsoft Edge v115开始,使用PowerShell (Core) 7+转义序列表示):
  • 在通过--app=<url> CLI参数打开的单独窗口中,将附加 no 后缀,并显示常规标题栏。
  • 在常规的、可能有多个选项卡的窗口中:
  • 如果一个窗口只有一个标签:
"$visibleTabTitle - $profileName - Microsoft`u{200b}Edge"

  • 如果一个窗口有 * 多个 * 标签:
  • 2个标签:
"$visibleTabTitle and 1 more page - $profileName - Microsoft`u{200b}Edge"

  • 3个或更多选项卡:
"$visibleTabTitle and $n more pages - $profileName - Microsoft`u{200b}Edge"

  • $visibleTabTitle$profileNames分别是向用户显示的选项卡标题和Edge配置文件名称的占位符; $n表示 * 附加 * 选项卡的数量。
  • 注意单词MicrosoftEdge之间的ZERO WIDTH SPACE(U+200B)字符的奇怪用法。

相关问题