Скриншоты на невидимом десктопе

Тема в разделе "WASM.WIN32", создана пользователем djmans, 23 апр 2009.

  1. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    Существует задача запустить в невидимом десктопе некий гуевый процесс, и исходя из некотрых событий мне нужно сделать скриншот его топ-окна. Делаю шоты через PrintWindow, софт типа calc, notepad идут нормально, однако тот же ie отрисовывает только не клиентскую часть. Вопрос: Что, где перехватить, изменить, удалить чтобы все рисовалось нормально?

    образец ie прилагается.
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    O_o Попробуй PrintWIndow дочернего окна, а именно того, что фоткается чёрным...
     
  3. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    пробывал, по отдельности всех шотить, кто то нормально шотится, кто-то также черный.

    Ну че, не кто окна рисовать не умеет? Что мне прехватить в процессе чтобы он думал что он на видемом десктопе?
     
  4. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    WM_PRINT не помогает? Или поиском по форуму вы принципиально не пользуетесь?

    http://www.wasm.ru/forum/viewtopic.php?id=31473
     
  5. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    WM_PRINT это аналог PrintWindow.
    Поиском мы пользуемся очень активо, указаный вами юрл, это не мой случай, он не помогает.
     
  6. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Вот кусочек кода который делает скриншот рабочего стола в Bitmap
    он на MFC, но можешь переделать на WinAPI
    Код (Text):
    1.     CWnd* pDesktopWnd = GetDesktopWindow();
    2.  
    3.     CDC* pDesktopDC = pDesktopWnd->GetDC();
    4.     CDC memDC;
    5.     CBitmap memBmp;
    6.     CBitmap* pOldBitmap;
    7.     int nDeskCY = GetSystemMetrics(SM_CYSCREEN);
    8.     int nDeskCX = GetSystemMetrics(SM_CXSCREEN);
    9.  
    10.  
    11.     memBmp.CreateCompatibleBitmap(pDesktopDC,nDeskCX,nDeskCY);
    12.  
    13.     memDC.CreateCompatibleDC(pDesktopDC);
    14.     pOldBitmap = memDC.SelectObject(&memBmp);
    15.     memDC.BitBlt(0,0,nDeskCX,nDeskCY,pDesktopDC,0,0,SRCCOPY);
    16.     memDC.SelectObject(pOldBitmap);
    17.     pDesktopWnd->ReleaseDC(pDesktopDC);
    в итоге в HBITMAP(memBmp) - наш скриншот
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    djmans
    А утилитка с этого "юрла" не помогла понять, что WM_PRINT - НЕ аналог PrintWindow ? :)
     
  8. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    2ntcdm - это все понятно, но не работает на НЕ АКТИВНОМ десктопе.
    2kero - да вижу, PrintWindow ваще уходит в sysenter сразуже.

    Короче я не решил проблему однако мне стало все более понятно.

    Все что я намутил прекрасно работает под вистой и семерокой, а именно - перебираю все окна и рисую их... Под ХР не прорисовываются только окна с CS_PARENTDC, возрашает FALSE. Что легко обьясняется описанием: A window with the CS_PARENTDC style bit receives a regular device context from the system's cache of device contexts. Все впринципе кажется решиться, если поставить перехват на RegisterClass и т.д., однако системные классы типа Edit, Static не регистрируются в процессе, и естевенно нельзя воздейстовать на них SetClassLong(GCL_STYLE). Что можно еще придумать с юзермода? Что то придумать с "system's cache of device contexts"?
     
  9. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    всем спасибо, решил проблему перехватом DefWindowProc.
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    djmans
    Так и где же этот хэппи энд, т.е. код ? :)
     
  11. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    в процесс отдлаке ), но осталась еше одна проблемка... как бы максимально быстро передать теперь шот из процесса кому принадлежат окна в процесс который запросил шот... CreateDIBSection... что то еще?