不想使用第三方工具和模块。
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate("https://www.google.com")
$ie.FullScreen = $true
while($ie.busy){
Start-Sleep -Seconds 10
}
Add-Type -AssemblyName System.Drawing
$bitmap = New-Object -TypeName System.Drawing.Bitmap -ArgumentList $ie.Width, $ie.Height
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)
$graphics.CopyFromScreen($ie.Left, $ie.Top, 0, 0, $bitmap.Size)
$ie.Quit()
$bitmap.Save("$env:HOMEPATH\desktop\capt.png")
答案1
为什么?
没有什么理由去尝试编写这个脚本。
Windows 10 及更高版本上的 MS Edge 已经具有屏幕捕获功能。您只需启用它即可。它被称为“Web 捕获”。
请注意,如果您只是想实时捕捉屏幕上的内容以进行文档记录,那么请查看内置的 Windows 操作系统问题步骤记录器 (PSR) 工具。
https://learn.microsoft.com/en-us/office/troubleshoot/settings/how-to-use-problem-steps-recorder
它已在 Windows 中存在几十年了。
最后,mspowershellgallery.com 中已经有模块可以提供屏幕捕获功能。
Find-Module -Name '*screenshot*'
Version Name Repository Description
------- ---- ---------- -----------
1.0 PSScreenshot PSGallery Save a screenshot from PowerShell.
6.0.0 Invoke-ExportServerScreenShotREDFISH PSGallery iDRAC cmdlet using Redfish API with ...
如果您确实想手动编写脚本,您可以执行类似这样的操作。虽然这不是 MSEdge 特有的,但它可以用于任何用途,因为它适用于整个主屏幕。
Add-Type -AssemblyName System.Windows.Forms,
System.Drawing
Start-Process -FilePath 'msedge' -ArgumentList '-inprivate', 'https://www.google.com' -Wait
$screens = [Windows.Forms.Screen]::PrimaryScreen
$top = ($screens.Bounds.Top |
Measure-Object -Minimum).Minimum
$left = ($screens.Bounds.Left |
Measure-Object -Minimum).Minimum
$width = ($screens.Bounds.Right |
Measure-Object -Maximum).Maximum
$height = ($screens.Bounds.Bottom |
Measure-Object -Maximum).Maximum
$bounds = [Drawing.Rectangle]::FromLTRB($left, $top, $width, $height)
$bmp = New-Object System.Drawing.Bitmap ([int]$bounds.width), ([int]$bounds.height)
$graphics = [Drawing.Graphics]::FromImage($bmp)
$graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
$bmp.Save("$env:USERPROFILE\Desktop\test.jpg")
$graphics.Dispose()
$bmp.Dispose()
更新
为了尽量减少问题。根据我的评论,您最终会在最后一行执行这样的命令。您将不得不四处寻找一个始终适合您用例的命令。
[System.Windows.Forms.SendKeys]::SendWait('% n {ENTER}')
笔记:
这并不是独一无二的,网络上有大量类似的情况,就在 SO 上,并在 Youtube 视频中展示。