2009-09-21 3 views
2

У меня есть поток, который прослушивает команды для моего приложения WPF. Если приложение WPF получает команду для выполнения скриншота, задача передается в «screenshotService». Я нашел код сом взять скриншот где-то на межсети, кажется, работает, но я нету обдумал .... я не могу взять этот скриншот из другого потока, что дает это исключение:WPF Сделайте снимок экрана из другой темы, кроме основной темы

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

слева сказать заключается в том, что подпись моего метода скриншота принимает UIElement из пользовательского интерфейса, эта сетка всегда одна и поэтапна для конструктора метода takeScreenshot.

Как мне пойти и снять этот снимок экрана?

+0

Вы уверены, что это скриншот код, который терпит неудачу? Возможно ли, что вы обновляете интерфейс WPF из потока, отличного от UI, и это повышает исключение? – Andy

ответ

1

Используйте Диспетчер или 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) 
{ 
} 
+0

Разве это не просто возвращает работу к основному потоку пользовательского интерфейса? – Matt

+1

Да, это так, и это то, что он должен делать, пользовательский интерфейс может обновляться только из потока пользовательского интерфейса. – luvieere

+0

Спасибо. Итак, где я могу это назвать, я получаю команду с потоком, и я предполагаю, что вышеуказанный код должен быть выполнен из основного потока? Так что я должен переместить код диспетчера в свой пользовательский интерфейс? то как сделать снимок экрана из моей командной строки? – H4mm3rHead

Смежные вопросы