Re[3]: Как из HWND получить HBITMAP ?
От: TK Лес кывт.рф
Дата: 15.01.03 08:26
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.


AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.


Точно? А как тогда работают различные утилиты для управления десктопами? Пункт "отправить окно в десктоп XXX" там никто не отменял...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как из HWND получить HBITMAP ?
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.01.03 08:29
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.


AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.


А как это эмулируют проги-мультидесктопы ? Я сам десктопы не ковырял просто.
Re: Как из HWND получить HBITMAP ?
От: SlaG  
Дата: 15.01.03 09:09
Оценка: 6 (1)
Лучше так:
1. создаешь compatible dc, инициализируешь — смотри код, как писали выше.
2. А теперь внимание:
SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0);
SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0);
и содержимое окна рисуется в наш DC (без наложения других окон).
3. забираешь bitmap у нашего DC.

P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
Re[2]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 15.01.03 11:21
Оценка:
SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.

В MSDN написано

For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.


Но как я помню, само окно не обязано рассматривать wparam как контекст устройства и тем более туда писать. Оно получает свой контекст из BeginPaint. Тем не менее попробую — интересно, вдруг и правда работает.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 15.01.03 11:56
Оценка:
Ну что ж. Это не работает. Факт. Система — win2k


        HWND hWnd = FindWindow(NULL, "WinZip");
        HDC hDC = GetWindowDC(hWnd);
        HDC hMemDC = CreateCompatibleDC(hDC);
        RECT theRect;
        GetWindowRect(hWnd, &theRect);
        int x =  theRect.right - theRect.left;
        int y = theRect.bottom - theRect.top;
        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, x, y);
        SelectObject(hMemDC, (HGDIOBJ)hBitmap);
        SendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hMemDC, 0); 
        SendMessage(hWnd, WM_PAINT, (WPARAM)hMemDC, 0);
        BitBlt(hMemDC, 0,0, x, y,hDC, 0,0, SRCCOPY);
        ReleaseDC(hWnd, hDC);
        CreateBMPFile("1.bmp", CreateBitmapInfoStruct(hBitmap), hBitmap, hMemDC);
        DeleteDC(hMemDC);
        DeleteObject(hBitmap);


WinZip скрыт за окном вижал студии. Без сообщений копируется кусок картинки экрана "над" винзипом
С сообщениями делается ровно то же. Any suggestions?

SG>Лучше так:

SG>1. создаешь compatible dc, инициализируешь — смотри код, как писали выше.
SG>2. А теперь внимание:
SG>SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0);
SG>SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0);
SG>и содержимое окна рисуется в наш DC (без наложения других окон).
SG>3. забираешь bitmap у нашего DC.

SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 15.01.03 14:00
Оценка:
Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Как из HWND получить HBITMAP ?
От: Кодт Россия  
Дата: 15.01.03 15:12
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.


Скорее всего, это результат использования CreateCompatibleBitmap.
Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.

Сделай для разнообразия CreateBitmap с TrueColor.
Перекуём баги на фичи!
Re[5]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 15.01.03 15:49
Оценка:
Еще раз. При использовании BitBlt все работает. Сохраняется часть экрана над WinZip.
Вы код то посмотрите — я его привел... Для разнообразия :/

AS>>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.


К>Скорее всего, это результат использования CreateCompatibleBitmap.

К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.

Чушь. В файл сохраняется битмапа с цветностью экрана... Вобщем, видимо, не стоит думать, что мы тут умнее Фень Юаня. Было бы можно проще — он бы так и сделал.
К>Сделай для разнообразия CreateBitmap с TrueColor.

PS
Внимательнее читайте постинги.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 15.01.03 15:54
Оценка:
К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.

Читать постинги надо и пользоваться MSDN Когда не читают — это действительно классические грабли :/

Because memory device contexts allow both color and monochrome bitmaps, the format of the bitmap returned by the CreateCompatibleBitmap function differs when the specified device context is a memory device context. However, a compatible bitmap that was created for a nonmemory device context always possesses the same color format and uses the same color palette as the specified device context.



        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, x, y);
        SelectObject(hMemDC, (HGDIOBJ)hBitmap);


Теперь видно?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Как из HWND получить HBITMAP ?
От: Кодт Россия  
Дата: 15.01.03 15:59
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Внимательнее читайте постинги.


Прости. Действительно.
Перекуём баги на фичи!
Re: Почитай MSDN - там это подробно описано.
От: Аноним  
Дата: 22.01.03 09:17
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>сабж
Re[2]: Почитай MSDN - там это подробно описано.
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.01.03 09:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Tom, Вы писали:


Tom>>сабж


Нюню...
Re[2]: Почитай MSDN - там это подробно описано.
От: Andrew S Россия http://alchemy-lab.com
Дата: 22.01.03 10:53
Оценка:
Аноним, представься А еще желательно видеть конкретные ссылки на топики MSDN где ЭТО подробно описано. Точнее не само это, как это ПРАВИЛЬНО сделать, а не то, что предлагает m$
Tom>>сабж
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Как из HWND получить HBITMAP ?
От: Аноним  
Дата: 22.01.03 13:46
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>сабж

Получить HDC и с ним делать, что хочешь
Re[2]: Как из HWND получить HBITMAP ?
От: Andrew S Россия http://alchemy-lab.com
Дата: 22.01.03 13:58
Оценка:
Уважаемый Аноним. Прочитайте пожалуйста ВСЕ постинги...
А>Получить HDC и с ним делать, что хочешь
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Как из HWND получить HBITMAP ?
От: Tom Россия http://www.RSDN.ru
Дата: 23.01.03 12:12
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>сабж


В общем как сделал я:

1. Создаём компатибле HDC на память.
2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап.
3. Делаем BitBlt из HDC формы в наш, который на памяти.
4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.


PS: Проверял правда только на NT
Народная мудрось
всем все никому ничего(с).
Re[2]: Как из HWND получить HBITMAP ?
От: Кодт Россия  
Дата: 23.01.03 12:28
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>1. Создаём компатибле HDC на память.

Tom>2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап.
Tom>3. Делаем BitBlt из HDC формы в наш, который на памяти.
Tom>4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.

Tom>PS: Проверял правда только на NT

И еще добавь: для окна, ничем сверху не перекрытого.

См. остальные сообщения этой ветки. Тут уже много сказано.
Перекуём баги на фичи!
Re[2]: Как из HWND получить HBITMAP ?
От: Тигра Беларусь  
Дата: 21.04.03 10:46
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

OP>Можно сделать так.

OP>Находим главное окно аппликации.
OP>Заставляем его всплыть. На сайте про это много постов.
OP>Далее грабим. И все.

Встречный вопрос: а если требуется "грабануть" не главное окно аппликации, а дочернее окно / контрол ? (Их то не заставишь вспыть!)
Можно конечно заставить всплыть родительское окно для требуемого дочернего...
Кроме того — проблема с перекрыванием нашего окна каким-либо TopLevel окном остаётся.
И даже если проверять, сохранять, изменять, и восстанавливать аттрибут TopLevel у нашего окна (что не есть красивое решение, имхо), всё равно остаётся проблема в случае с частично видимым (или полностью невидимым) окном — не думаю, что двигать /(показывать и прятать) искомое окно — это выход.
Так что не проходит.

OP>Вместо всплывания можно создать десктоп еще один и засунуть окно туда. А потом десктоп грохнуть.

OP>В MSDN есть примерчик с десктопами.

Ну зачем всё усложнять-то так?!
Re: Как из HWND получить HBITMAP ?
От: Signatec Россия  
Дата: 06.01.05 16:16
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>сабж


The PrintWindow function copies a visual window into the specified device context (DC), typically a printer DC.
Re[2]: Как из HWND получить HBITMAP ?
От: mOzG573  
Дата: 22.11.05 12:51
Оценка:
invoke GetDC,windhand
mov hDC,eax

invoke CreateCompatibleDC,hDC
mov hMemDC,eax



invoke CreateCompatibleBitmap,hDC,1024,768
mov hBitmap,eax
invoke SelectObject,hMemDC,hBitmap

invoke SendMessage,windhand,WM_PAINT,hMemDC,0
invoke SendMessage,windhand,WM_ERASEBKGND,hMemDC,0

invoke BitBlt,hMemDC,0,0,1024,768,hDC,0,0,SRCCOPY
invoke ReleaseDC,windhand,hDC


invoke GetPixel,hMemDC,1000,5
mov Color,eax

Pls obysnite 4ego en prawelno delay pri otkritom oktne wse normalno beretza nujnii pixel a wot kogda sakrito okno todrugim ili swernuto ne pomogart hoty wrode kak WM_PAINT posilay moemu oknu , wesi topik pro4ital no ne kak ne ponyl w 4em sagwoska
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.