is there a way to get the clipboard data, whatever type contents it may contain, into a variable for hashing?
I've been able to do it for specific format type, e.g.
$data = Get-Clipboard -Format Image
$ms = New-Object System.IO.MemoryStream
$data.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
$mystream = [IO.MemoryStream]::new([byte[]][char[]]$ms.GetBuffer())
$hash = Get-FileHash -InputStream $mystream -Algorithm SHA1 | Select-Object -ExpandProperty Hash
write-host $hash
How can it be done with $data = Get-Clipboard -raw ?
If you just want to check if clipboard content has changed, you may query the clipboard sequence number.
Here is a complete code sample to detect clipboard changes by comparing the current sequence number with the previous one in a loop.
It also demonstrates how the increase in sequence numbers correlates with the number of formats currently stored in the clipboard.
# Define the p/invoke signatures for using the WinAPI clipboard functions.
Add-Type -NameSpace WinApi -Name ClipboardSeq -MemberDefinition '[DllImport("user32.dll")] public static extern uint GetClipboardSequenceNumber();'
Add-Type -NameSpace WinApi -Name CountClipboardFmt -MemberDefinition '[DllImport("user32.dll")] public static extern int CountClipboardFormats();'
# Get the current clipboard sequence number
$lastSequenceNumber = [WinApi.ClipboardSeq]::GetClipboardSequenceNumber()
# Loop to poll for clipboard changes
while($true) {
$newSequenceNumber = [WinApi.ClipboardSeq]::GetClipboardSequenceNumber()
if( $lastSequenceNumber -ne $newSequenceNumber ) {
$lastSequenceNumber = $newSequenceNumber
"Clipboard has changed. New sequence number is: $newSequenceNumber"
$numFormats = [WinApi.CountClipboardFmt]::CountClipboardFormats()
"Number of formats in clipboard: $numFormats"
}
# Delay for one second to avoid CPU congestion.
Start-Sleep 1
}
A typical output may look like this:
Clipboard has changed. New sequence number is: 451
Number of formats in clipboard: 4
Clipboard has changed. New sequence number is: 456
Number of formats in clipboard: 4
Clipboard has changed. New sequence number is: 460
Number of formats in clipboard: 3
On the Win 10 system where I got this output the sequence number increment seems to be number of clipboard formats plus one. On another Win 10 system there was still a correlation, but a bigger difference (like 7 clipboard formats and an increase in sequence number of 13). I can't really explain these differences and there doesn't seem to exist a documentation. All that you can rely on is that the sequence number will increase if new data is put into the clipboard.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With