Снимок экрана не работает в приложении MFC в Vista - PullRequest
0 голосов
/ 18 сентября 2008

У нас есть несколько собственных приложений, встроенных в MFC, с процедурами рисования OpenGL. Все они используют один и тот же код для рисования на экране и либо распечатывают экран, либо сохраняют его в файл JPEG. В Windows XP все работает нормально, и мне нужно найти способ заставить их работать в Vista.

В трех наших приложениях все работает. В оставшейся части я могу получить границу окна, строку заголовка, меню и панель задач, но интерьер никогда не отображается. Как я уже сказал, эти приложения используют один и тот же код для записи на экран и захвата изображения окна, и единственное отличие, которое я вижу, выглядит так, как будто это может иметь значение, в том, что проблемное приложение использует интерфейс нескольких документов MFC, в то время как эта работа использует единый интерфейс документа.

Либо ответа нет в сети, либо я в Гугле хуже, чем думал. Я спросил на форумах MSDN, и единственное практическое предложение, которое я получил, было использовать GDI +, а не GDI, и это ничего не изменило. Я пробовал разные вещи с каждой частью кода, которая захватывает и печатает или сохраняет, учитывая указатель на окно, так что, очевидно, это вопрос самого окна. Я еще не перестроил приложение-нарушитель с помощью SDI, и у меня действительно нет других идей.

Кто-нибудь видел что-нибудь подобное?


У меня есть четыре приложения. Они используют много общего кода и обмениваются действительными файлами .h и .cpp, поэтому я знаю, что код для рисования и захвата экрана идентичен.

Существует подпрограмма WindowtoDIB (), которая принимает * pWnd, исходный прямоугольник и размер назначения. Это выглядит как слегка адаптированный код Microsoft, и я нашел другие функции в этом файле на сайте Microsoft. Из моих четырех приложений три справляются с этим просто отлично, но одно - нет. Самым очевидным отличием является то, что проблемой является MDI.

Мне кажется, что проблема в * pWnd. Я далеко не гуру MFC, и мне кажется, что проблема может заключаться в том, что у нас есть одна настройка окна в SDI и больше, чем в MDI. Возможно, я передаю неправильный * pWnd функции.

Между тем, он начал нормально работать на 64-битной машине Vista, хотя он все еще не работает на 32-битной машине Vista. Понятия не имею почему. Со времени последних тестов я ничего не изменил, и я не думал, что кто-то еще это сделал. (В 32-разрядной версии клавиша Print Screen работает, как и ожидалось, но не сохраняет экран в формате JPEG.)

Ответы [ 5 ]

1 голос
/ 18 сентября 2008

Если вам нужно содержимое CView, то да, это должно быть правильно. Если это содержимое всего экрана (по крайней мере, содержимого, без панелей инструментов и строки состояния), то вы должны передать ему CMainFrame (это имя по умолчанию, которое могло быть изменено, которое получено из CMDIFrameWnd ).

Можете ли вы опубликовать код WindowToDIB ()? Я только что попробовал, и это работает для меня, но без кода OpenGL в представлении. Попробуйте передать следующие окна вашей функции WindowToDIB ():

CMainFrame * mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

и посмотри, что получишь.

1 голос
/ 18 сентября 2008

В заголовке вашего вопроса упоминается снимок экрана, но на самом деле это не так. Пожалуйста, уточните более четко. Проблема в том, что вы можете сделать снимок экрана трех ваших приложений, но не четвертого? Вы можете использовать другое программное обеспечение для захвата экрана, которое может захватывать окна OpenGL / DirectX. Эти поверхности обрабатываются непосредственно диспетчером окон и не отображаются с простым PrtScn.

Переключение на GDI + не решит, как и переход на SDI.

0 голосов
/ 15 декабря 2009

Мы в конечном итоге решили эту проблему, создав другой контекст OpenGL и привлекая к этому все Мы отказались от захвата экрана.

0 голосов
/ 18 сентября 2008

Извините, я до сих пор не понимаю. Вы пытаетесь заставить клавишу Print Screen работать во всех четырех приложениях? Или вы пытаетесь заставить работать функцию WindowtoDIB (), которая берет «скриншот» (из вашего собственного приложения) самого приложения, чтобы его можно было сохранить в виде файла изображения?

Кроме того, что вы имеете в виду, когда он говорит, что клавиша Print Screen работает, как ожидалось, но она не сохраняет экран в формате JPEG.? Print Screen только копирует в буфер обмена, что происходит при вставке в Paint?

Если ваша функция WindowtoDIB () только «захватывает» окно, которое вы ей передаете, то да, ваши дочерние окна MDI не будут отображаться.

0 голосов
/ 18 сентября 2008

Содержимое каждого окна является поверхностями DirectX и собирается только оконным менеджером в графической карте. Вы не сможете захватить это, если не отключите новый интерфейс (DWM) или код специально для захвата экрана из DWM.

В Википедии есть хорошее описание Менеджера окон рабочего стола (DWM)

...