我想创建一个用于浏览剪贴板图像的可视化界面。
因此,我会有一个监听剪贴板内容的进程。
我的问题是:
Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase
$previousImageHash = $null
while ($true) {
$image = [System.Windows.Clipboard]::GetImage()
if ($image) {
$currentImageHash = $image.GetHashCode()
if ($currentImageHash -ne $previousImageHash) {
Write-Host $currentImageHash
$previousImageHash = $currentImageHash
}
}
Start-Sleep -Seconds 1
}
运行上面的代码后,当我将图像复制到剪贴板时,它将继续连续打印。
我不明白的是,如果我不将新图像复制到剪贴板,它应该只打印一次。
或者是每次调用
GetImage
时,它不仅检索图像信息,而且还将一些附加信息(例如时间)写入剪贴板?
如果我不想更改剪贴板,有什么方法可以检测图像更改吗?
尝试使用剪贴板序列号
看到这个答案
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();'
$lastSequenceNumber = [WinApi.ClipboardSeq]::GetClipboardSequenceNumber()
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"
}
Start-Sleep 1
}