PrintScreen 后剪贴板中没有图像。如何等待它可用?
No image in Clipboard after PrintScreen. How to wait while it will available?
我创建了一个全局键盘钩子。它工作正常,PreentScreen 印刷机被捕获。但按下后需要等待一段时间,直到出现剪贴板上的图像。如果立即尝试获取图片 - 将是空的。如何更好地实施?
我的代码:
...
if (e.KeyPressed == Key.PrintScreen)
{
// There need to wait before get a picture
if (!Clipboard.ContainsImage()) return;
var screenshot = Clipboard.GetImage();
...
}
PS: "Thread.Sleep(... ms)" 无效。可能是因为它发生在主线程中。
我还没有尝试过,但是如果你删除了 if 语句会怎样……比如尝试这样的事情……
if (e.KeyPressed == Key.PrintScreen)
{
BitmapSource screenshot = System.Windows.Clipboard.GetImage();
}
我的解决方案。也许不好,但它有效。
if (e.KeyPressed == Key.PrintScreen)
{
Thread th = new Thread(() =>
{
try
{
while (!Clipboard.ContainsImage());// There need to wait before get a picture
var screenshot = Clipboard.GetImage();
...
}
catch { }
finally { Clipboard.Clear(); }
});
th.TrySetApartmentState(ApartmentState.STA);
th.Start();
}
PS:我还加了一个周期的检查时间,所以不会运行永远。为了避免复杂化,我没有在代码中展示它。
我会设置一个定时器在 250 毫秒后给我回电话,然后让 KeyPressed 事件继续。在剪贴板调用周围使用 try/except/sleep 包装器以防失败。您将与合法监控剪贴板的应用程序发生冲突(通过剪贴板通知 API),因此您应该预料到(并处理)由于其他人打开剪贴板而导致的失败。
我创建了一个全局键盘钩子。它工作正常,PreentScreen 印刷机被捕获。但按下后需要等待一段时间,直到出现剪贴板上的图像。如果立即尝试获取图片 - 将是空的。如何更好地实施? 我的代码:
...
if (e.KeyPressed == Key.PrintScreen)
{
// There need to wait before get a picture
if (!Clipboard.ContainsImage()) return;
var screenshot = Clipboard.GetImage();
...
}
PS: "Thread.Sleep(... ms)" 无效。可能是因为它发生在主线程中。
我还没有尝试过,但是如果你删除了 if 语句会怎样……比如尝试这样的事情……
if (e.KeyPressed == Key.PrintScreen)
{
BitmapSource screenshot = System.Windows.Clipboard.GetImage();
}
我的解决方案。也许不好,但它有效。
if (e.KeyPressed == Key.PrintScreen)
{
Thread th = new Thread(() =>
{
try
{
while (!Clipboard.ContainsImage());// There need to wait before get a picture
var screenshot = Clipboard.GetImage();
...
}
catch { }
finally { Clipboard.Clear(); }
});
th.TrySetApartmentState(ApartmentState.STA);
th.Start();
}
PS:我还加了一个周期的检查时间,所以不会运行永远。为了避免复杂化,我没有在代码中展示它。
我会设置一个定时器在 250 毫秒后给我回电话,然后让 KeyPressed 事件继续。在剪贴板调用周围使用 try/except/sleep 包装器以防失败。您将与合法监控剪贴板的应用程序发生冲突(通过剪贴板通知 API),因此您应该预料到(并处理)由于其他人打开剪贴板而导致的失败。