Сделайте скриншот любого внешнего приложения, используя C # - PullRequest
3 голосов
/ 16 апреля 2009

У нас есть приложение на C # (WPF), в котором мы хотим сделать снимок экрана с произвольным приложением, запущенным нами (т.е. у нас есть ссылка на процесс, который мы запустили). Приложение может быть свернуто или скрыто за другими окнами, но мы по-прежнему хотим только изображение отдельного приложения, а не перекрывающиеся пиксели.

Мне известны типичные решения P / Invoke, использующие BitBlt или PrintWindow , которые работают большую часть времени, но они терпят неудачу (я получаю только черные / прозрачные пиксели) при работе с приложением DirectX или OpenGL, которое рисует напрямую на графическое устройство. Я нашел эту статью о том, как сделать снимок приложения Direct3D из C #, так что я думаю, что я рассмотрел этот случай.

Так что мой вопрос таков:

  1. Как бы я сделал это для приложения OpenGL?
  2. Какой самый простой способ определить подходящий метод для использования (PW / DX / GL)?
  3. Есть ли единый универсальный способ сделать это?

Что касается # 2, могу ли я проверить модули, загруженные исполняемым файлом, и посмотреть, загружена ли DLL / сборка DirectX или OpenGL?

Это должно выполняться только в Windows XP (не кросс-платформенной и не собираться в Vista / 7 в ближайшее время, если вообще для этого приложения).

1 Ответ

1 голос
/ 18 апреля 2009

Ответ на 1: в OpenGL вы можете вызвать glReadBuffer и glReadPixels, чтобы получить растровое изображение экрана. Однако это происходит медленно (поэтому вы не вызываете его повторно каждый кадр), и у вас также могут возникнуть проблемы, когда окно GL перекрывается другим приложением / окном. Правильный способ сделать это - «визуализировать в текстуру» (Google google), используя pbuffer .

Идея для 2: Если у вас есть дескриптор окна, вы можете получить структуру pixelformatdescriptor и проверить ее. Никогда не пробовал, хотя.

Для 3: Кстати, я не думаю, что есть какой-то универсальный способ сделать это без каких-либо проблем ..

...