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),因此您应该预料到(并处理)由于其他人打开剪贴板而导致的失败。