-
Notifications
You must be signed in to change notification settings - Fork 0
/
Screenshot.ps1
117 lines (90 loc) · 4.04 KB
/
Screenshot.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
function Get-ScreenShot
{
[CmdletBinding(DefaultParameterSetName='OfWholeScreen')]
param(
# If set, takes a screen capture of the current window
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
ParameterSetName='OfWindow')]
[Switch]$OfWindow,
# The path for the screenshot.
# If this isn't set, the screenshot will be automatically saved to a file in the current directory named ScreenCapture
[Parameter(ValueFromPipelineByPropertyName=$true)]
[string]
$Path,
# The image format used to store the screen capture
[Parameter(ValueFromPipelineByPropertyName=$true)]
[ValidateSet('PNG', 'JPEG', 'TIFF', 'GIF', 'BMP')]
[string]
$ImageFormat = 'JPEG',
# The time before and after each screenshot
[Parameter(ValueFromPipelineByPropertyName=$true)]
[Timespan]$ScreenshotTimer = "0:0:0.125"
)
begin {
Add-Type -AssemblyName System.Drawing, System.Windows.Forms
}
process {
$Monitors = [System.Windows.Forms.Screen]::AllScreens
$finalWidth = 0;
$finalHeight = 0;
foreach ($Monitor in $Monitors)
{
$DeviceName = (($Monitor.DeviceName).replace("\", "")).replace(".", "")
$Width = $Monitor.bounds.Width
$finalWidth = $finalWidth + $Width;
$Height = $Monitor.bounds.Height
if ($Height -gt $finalHeight) {
$finalHeight = $Height;
}
}
#Write-Host "$finalWidth x $finalHeight"
#region Codec Info
$Codec = [Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() |
Where-Object { $_.FormatDescription -eq $ImageFormat }
$ep = New-Object Drawing.Imaging.EncoderParameters
if ($ImageFormat -eq 'JPEG') {
$ep.Param[0] = New-Object Drawing.Imaging.EncoderParameter ([System.Drawing.Imaging.Encoder]::Quality, [long]100)
}
#endregion Codec Info
#region PreScreenshot timer
if ($ScreenshotTimer -and $ScreenshotTimer.TotalMilliseconds) {
Start-Sleep -Milliseconds $ScreenshotTimer.TotalMilliseconds
}
#endregion Prescreenshot Timer
#region File name
if (-not $Path) {
$screenCapturePathBase = "$pwd\ScreenCapture"
} else {
$screenCapturePathBase = $Path
}
$c = 0
while (Test-Path "${screenCapturePathBase}${c}.$ImageFormat") {
$c++
}
#endregion
#region PostScreenshot timer
if ($ScreenshotTimer -and $ScreenshotTimer.TotalMilliseconds) {
Start-Sleep -Milliseconds $ScreenshotTimer.TotalMilliseconds
}
#endregion Postscreenshot Timer
Get-Item -ErrorAction SilentlyContinue -Path "${screenCapturePathBase}${c}.$ImageFormat"
$bounds = New-Object Drawing.Rectangle -Property @{
Width = $finalWidth
Height = $finalHeight
}
$bitmap = New-Object Drawing.Bitmap $bounds.width, $bounds.height
$graphics = [Drawing.Graphics]::FromImage($bitmap)
$graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
#region PostScreenshot timer
if ($ScreenshotTimer -and $ScreenshotTimer.TotalMilliseconds) {
Start-Sleep -Milliseconds $ScreenshotTimer.TotalMilliseconds
}
#endregion Postscreenshot Timer
$bitmap.Save("${screenCapturePathBase}${c}.$ImageFormat", $Codec, $ep)
$graphics.Dispose()
$bitmap.Dispose()
Get-Item -ErrorAction SilentlyContinue -Path "${screenCapturePathBase}${c}.$ImageFormat"
}
}
Get-ScreenShot