WPF如何从非主线程中获取屏幕截图

4

我有一个线程监听我的WPF应用程序的命令。如果WPF应用程序收到截屏命令,则将任务交给“screenshotService”。我在互联网上找到了一些代码来截取屏幕截图,似乎可以工作,但我没有深思熟虑......我无法从另一个线程中截取此屏幕截图,会出现以下异常:

{"This API was accessed with arguments from the wrong context."}

需要说明的是,我的截屏方法的签名从UI中获取了一个UIElement。这个网格始终是相同的,并传递给takeScreenshot方法的构造函数。

那么我该如何进行截屏呢?


你确定是截图代码出了问题吗?有可能是你在非UI线程中更新了WPF UI,导致了异常抛出。 - Andy
1个回答

2
使用Dispatcher或BackgroundWorker来完成任务:
ThreadStart start = delegate()
{
   Dispatcher.Invoke(DispatcherPriority.Normal, 
                new Action<string>(TakeScreenshot), 
                "From Other Thread");
};

new Thread(start).Start();







BackgroundWorker _backgroundWorker = new BackgroundWorker();

_backgroundWorker.DoWork += _backgroundWorker_TakeScreenshot;


_backgroundWorker.RunWorkerAsync(5000);

void _backgroundWorker_TakeScreenshot(object sender, DoWorkEventArgs e)
{
}

1
是的,没错,这就是它应该做的,UI 只能从 UI 线程更新。 - luvieere
谢谢。那么我在哪里调用它呢?我使用线程接收命令,我猜上面的代码应该从主线程执行?那么我必须将分派器代码移动到我的UI中吗?然后我如何从我的命令线程中截取屏幕截图? - H4mm3rHead
NVM。我意识到我可能需要一个UI命令队列,并将其实现在我的普通命令队列上。因此,现在UI会定期检查命令队列中是否有任何可用的UI命令。 - H4mm3rHead
1
从命令线程中,您可以使用UI线程中的TakeScreenshot方法调用调度程序。在那里,您可以拍摄屏幕截图。在命令线程中,当您想要拍摄屏幕截图时,以下行Dispatcher.Invoke(DispatcherPriority.Normal, new Action<string>(TakeScreenshot), "From Other Thread");将会被调用。它将在UI线程中调用该方法,执行来自屏幕截图服务的代码。 - luvieere
@luvieere,你能告诉我如何在页面加载后延迟4秒调用takescreen方法吗? - Farhan Mukadam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接