Как перенаправить прорисовку чужого окна так, чтобы оно отображалось куда-нибудь в память моей программы, а на десктопе при этом было невидимо? В идеале требуется, чтобы окно рисовалось на поверхность DirectX'а или OpenGL'я в fullscreen mode. Понятно, что я могу перехватить HDC окна через GetWindowDC(), но как его подменить? Подскажите ссылки по устройству GDI (не как при помощи него рисовать, а как он работает, как его создает и использует система).
Мне нужно заставить рисоваться GUI-окошки, вроде калькулятора или сапера на поверхности DirectX, а не на десктопе, чтобы можно было отображать их в трехмере. Пока нашел книгу Feng Yuan'а "Windows Graphics Programming Win32 GDI and DirectDraw", описывающую внутренее устройство GDI и несколько форумов на тему перехвата GDI-функций чужих программ. Пока все заходят в тупик. Под Win9x по идее, можно использовать GDI hooking, а под XP DDK есть Mirror Driver (насколько я понял, он дублирует изменения при рисовании на несколько устройств, как например, при нескольких мониторах). Но вот насколько все это мне подходит я не знаю. Мне кажется можно сделать проще. Мне нужно просто сделать, чтобы окно сторонней программы, вроде сапера рисовалось в память.
Поскольку приложения используют хэндлер HDC при любой прорисовке окна (меня пока не интересуют окна, рисующие через DirectX, OpenGL и прочее), то если каким-то образом передать ему другой хэндлер с аналогичным форматом буфера, но в памяти (CreateCompatibleDC), то окно будет рисоваться в нужную область памяти. Насколько я помню, в DirectX'е можно использовать для поверхности уже заполненный кусок памяти. То есть задача сводится к тому, чтобы для указанного окна на время заменить его основной HDC на свой внутренний. В этом случае могут возникнуть проблемы с GDI. Например, если у меня есть 50 окон, и я их всех заставил рисоваться в памяти, как GDI будет определять какие из них перекрываются, а какие нет? Он-то будет думать, что они все на десктопе (или нет?). Можно еще заодно сделать чужое окно TOPMOST, но не уверен, что это решит проблему.
Видео захват штука медленная, по крайней мере то, что я видел. Кроме того, непонятно когда делать этот самый захват? Каждый раз копировать буфер DC накладно. Вот если бы приложение само рисовалось сразу на поверхность DirectX, когда ему надо, а я бы ее сразу отображал, вот это да! Мне нужно, чтобы окна висели в разных частях такой 3d-комнаты, можно было подойти, потыкать в них мышкой как обычно, прокрутить скролл-бар итд. Отойти, подойти к другому окну.
Кроме того, мое окно закрывает все другие, поскольку будет работать в полноэкранном режиме, и при этом другие окна все равно должны рисоваться в нужную мне память и еще к тому же не перекрываться между собой.