Подменить HDC чужого окна

Тема в разделе "WASM.WIN32", создана пользователем Agriop, 27 дек 2005.

  1. Agriop

    Agriop New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Как перенаправить прорисовку чужого окна так, чтобы оно отображалось куда-нибудь в память моей программы, а на десктопе при этом было невидимо? В идеале требуется, чтобы окно рисовалось на поверхность DirectX'а или OpenGL'я в fullscreen mode.



    Понятно, что я могу перехватить HDC окна через GetWindowDC(), но как его подменить?



    Подскажите ссылки по устройству GDI (не как при помощи него рисовать, а как он работает, как его создает и использует система).
     
  2. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  3. Agriop

    Agriop New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Мне нужно заставить рисоваться GUI-окошки, вроде калькулятора или сапера на поверхности DirectX, а не на десктопе, чтобы можно было отображать их в трехмере.



    Пока нашел книгу Feng Yuan'а "Windows Graphics Programming Win32 GDI and DirectDraw", описывающую внутренее устройство GDI и несколько форумов на тему перехвата GDI-функций чужих программ. Пока все заходят в тупик.



    Под Win9x по идее, можно использовать GDI hooking, а под XP DDK есть Mirror Driver (насколько я понял, он дублирует изменения при рисовании на несколько устройств, как например, при нескольких мониторах). Но вот насколько все это мне подходит я не знаю. Мне кажется можно сделать проще.



    Мне нужно просто сделать, чтобы окно сторонней программы, вроде сапера рисовалось в память.
     
  4. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Короче дело нудное. Объясни свой текущий подход.
     
  5. Topor

    Topor New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    31




    Так может окно просто грабить( ну типа как видео захват) ?
     
  6. Agriop

    Agriop New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Поскольку приложения используют хэндлер HDC при любой прорисовке окна (меня пока не интересуют окна, рисующие через DirectX, OpenGL и прочее), то если каким-то образом передать ему другой хэндлер с аналогичным форматом буфера, но в памяти (CreateCompatibleDC), то окно будет рисоваться в нужную область памяти. Насколько я помню, в DirectX'е можно использовать для поверхности уже заполненный кусок памяти.



    То есть задача сводится к тому, чтобы для указанного окна на время заменить его основной HDC на свой внутренний.



    В этом случае могут возникнуть проблемы с GDI. Например, если у меня есть 50 окон, и я их всех заставил рисоваться в памяти, как GDI будет определять какие из них перекрываются, а какие нет? Он-то будет думать, что они все на десктопе (или нет?). Можно еще заодно сделать чужое окно TOPMOST, но не уверен, что это решит проблему.
     
  7. Agriop

    Agriop New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    5
    Адрес:
    Russia


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

    Каждый раз копировать буфер DC накладно.



    Вот если бы приложение само рисовалось сразу на поверхность DirectX, когда ему надо, а я бы ее сразу отображал, вот это да!



    Мне нужно, чтобы окна висели в разных частях такой 3d-комнаты, можно было подойти, потыкать в них мышкой как обычно, прокрутить скролл-бар итд. Отойти, подойти к другому окну.
     
  8. Agriop

    Agriop New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Кроме того, мое окно закрывает все другие, поскольку будет работать в полноэкранном режиме, и при этом другие окна все равно должны рисоваться в нужную мне память и еще к тому же не перекрываться между собой.