Powershell 脚本来捕获屏幕截图

Powershell 脚本来捕获屏幕截图

不想使用第三方工具和模块。

$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 捕获”。

https://techcommunity.microsoft.com/t5/articles/introducing-web-capture-for-microsoft-edge/mp/1721318

请注意,如果您只是想实时捕捉屏幕上的内容以进行文档记录,那么请查看内置的 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 视频中展示。

相关内容