Есть ли способ захватить растровое изображение из окна WPF с помощью собственного C ++?

Представьте себе окно документа в приложении MDI, которое содержит дочернее окно WPF, например, боковую панель. Как можно получить растровое изображение, содержащее как пиксели WPF, так и пиксели GDI (не wpf)?

Я обнаружил, что при наведении курсора на эскиз своего эскиза для значка приложения на панели задач Win7 я становлюсь черным в тех частях предварительного просмотра, где должны быть пиксели WPF. Мой текущий метод просто захватывает растровое изображение окна документа. Затем я получаю DC для предварительного просмотра, делаю из него DC памяти и выделяю в него свое растровое изображение. Затем я делаю некоторые настройки размера и преобразовываю постоянный ток памяти в реальный постоянный ток. Я предполагаю, что операция BitBlt не принимает во внимание тот факт, что пиксели WPF имеют аппаратное ускорение и, следовательно, должны быть получены с графического оборудования. Все вещи в GDI управляются просто отлично, хотя и когда нет дочерних окон WPF, изображение предварительного просмотра выглядит нормально.

Мне интересно, можно ли вообще получить растровое изображение окна WPF из собственного C ++. Затем я могу нанести это на черную область предыдущего превью.


person Mike Caron    schedule 08.04.2010    source источник
comment
Я думаю, что, поскольку WPF имеет аппаратное ускорение, должен быть способ получить пиксели из DirectX. Не знаю, как бы я это сделал ...   -  person Mike Caron    schedule 09.04.2010
comment
Есть ли собственная версия RenderTargetBitmap?   -  person Mike Caron    schedule 09.04.2010
comment
Мне сказали, что, возможно, лучший способ - создать уровень взаимодействия C ++ / CLI, который я могу вызывать из C ++, который вернет мне CBitmap. В этом случае я могу использовать RenderTargetBitmap для получения пикселей WPF.   -  person Mike Caron    schedule 09.04.2010


Ответы (2)


Возможно, я неправильно понимаю ваш текущий подход, но не могли бы вы сделать BitBlt() с экрана DC на DC вашей памяти? Вам нужно получить прямоугольник экрана вашего окна, но это не должно быть так уж плохо.

person Andy    schedule 09.04.2010
comment
Это не будет работать с WPF, поскольку WPF выполняет рендеринг на графическом оборудовании, а не в контексте устройства. Это процесс, который я использую до сих пор, и все, что я получаю, - это черные пиксели. - person Mike Caron; 09.04.2010
comment
Хорошо, я не был уверен, что именно ваш нынешний подход был основан на вашем вопросе. Я надеюсь, что вы получите хороший ответ на свой вопрос. :) - person Andy; 09.04.2010
comment
Вы можете изменить свой аппаратный уровень до менее 2, тогда WPF будет производить программный рендеринг. - person RandomNickName42; 02.04.2011

Чтобы решить эту проблему, мне пришлось создать абстрактный класс в машинном коде, содержащий виртуальный метод для получения растрового изображения, который был реализован в C ++ / CLI. В управляемой реализации я использовал класс .NET RenderTargetBitmap для получения растрового изображения окна WPF, а затем заполнил переданный объект CBitmap (см. Как получить структуру BITMAP из RenderTargetBitmap в C ++ / CLI?). В неуправляемой подпрограмме вызывающего я использовал виртуальный метод для получения Bitmap.

Короче говоря, не было возможности получить растровое изображение, просто используя неуправляемый C ++, поскольку WPF и GDI действительно не работают вместе для всех практических целей.

person Mike Caron    schedule 09.06.2010