[so] [WinAPI]Capture Window with Alpha Channel
Daniel Flamaropol
raptorclw at gmail.com
Tue Jun 16 01:23:48 EEST 2009
Ah, am inteles. Problema e ca atunci cand dai PrintWindow, practic iti face
un print la rectangle-u in care e fereastra ta, si in rest pune negru.
(Incearca sa dai alt-printscrn pe o fereastra si vei avea acelasi rezultat
in clipboard).
O solutie simpla este sa apelezi PrintWindow(hDesktop,.. ) unde hDesktop
este HWND-ul desktop-ului. Nu mai tin minte clar cum il obtii, dar cel mai
probabil este parintele hwnd-ului curent, deci ai putea sa mergi din hwnd in
hwnd in sus in arbore pana dai de desktop (sau e chiar primul). Oricum, msdn
stie.
Asa vei obtine o imagine foarte mare. Daca iei rectangle-ul ferestrei
curente, ii iei dimensiunile si pozitia, poti sa faci crop din bitmap-ul
obtinut de la PrintWindow si voila, ai textura ta. Ar trebui sa includa si
transparenta. Nu tin minte comenzile, dar sunt operatii destul de rutina pe
btimap-uri.
Si ca un sfat, daca nu esti constrans de alte lucruri (parte dintr-un
proiect mai mare, obligatie de a folosi cod non-managed, etc) incearca sa
folosesti .NET si nu WinApi (orice proiect existent winapi poate include
librariile .NET foarte simplu). Are o biblioteca foarte facil de utilizat,
atat pt directX, cat si pentru GDI si editare bitmap-uri. Acolo ai putea sa
faci printwindow cu directshow, si ar fi mult mult mai rapid. (nu ma astept
la mai mult de 10fps daca vrei sa faci print la desktop la fiecare frame).
Numai bine,
Dani
2009/6/16 Alin Popescu <alinpopescu at live.com>
> Salut
>
> Multumesc pentru raspunsul rapid.
>
> Ideea e ca orice fereastra de windows are transparenta. La XP ea e se poate
> observa la colturile ferestrelor, care sunt netede
> (rotunde). Eu incerc sa salvez si alpha channel din device context-ul unde
> se renderizeaza fereastra ca apoi,
> in Direct3D, sa apara la fel de netede.
>
> Pana acum nu am reusit sa salvez decat RGB + A constant. Prin urmare in
> colturi imi apare o zona neagra.
> Alpha-ul texturii e 255 constant. As putea sa fac un pixel shader si sa ma
> folosesc de alpha test
> ca sa scot colturile negre, dar apare o problema daca in ferestra exista
> pixeli negrii(de exemplu text).
>
>
>
> On Tue, 16 Jun 2009 01:10:15 +0300, Daniel Flamaropol <raptorclw at gmail.com>
> wrote:
>
> Salut.
>>
>> Ce vrei sa spui prin "nu reusesc sa salvez si alpha channel" ?. Din ce am
>> inteles eu, vrei sa faci un print screen la o fereastra.
>> Unde ar fi alpha channel acolo? De asemenea, ce intelegi prin "ferestre 3D
>> cu transparenta"?
>>
>> Presupun ca vrei sa faci o fereastra de Direct3D care sa para
>> transparenta,
>> la fiecare frame facand un capture la ce se afla
>> in spatele ei, si randand respectiva textura in Direct3D (pe un quad
>> eventual). Asta e?
>>
>> Numai bine,
>> Dani
>>
>> 2009/6/16 Andrei Cibotaru <andreicibotaru at gmail.com>
>>
>> Pai nu poti sa ii dai tu din direct3d transparenta?
>>>
>>> 2009/6/16 Alin Popescu <alinpopescu at live.com>
>>>
>>> Salut!
>>>
>>>>
>>>> Nu are legatura cu ce s-a facut pe la so, dar are legatura cu mult prea
>>>> obscurul WinAPI.
>>>> Incerc sa fac o captura de fereastra si sa salvez pixelii intr-o textura
>>>> de Direct3D. In final ferestre 3D cu transparenta :)
>>>>
>>>> Problema mea e ca nu reusesc sa salvez si alpha channel din fereastra.
>>>> Am incercat sa folosesc si GetDIBits, dar fara rezultate.
>>>>
>>>> Poate a mai incercat cineva de pe aici si i-a gasit solutie.
>>>> L-as ruga sa o impartaseasca cu comunitatea de WinAPI devs.
>>>>
>>>> void CaptureWindow(HWND hWnd, LPDIRECT3DTEXTURE9 Tex)
>>>> {
>>>> HDC hdcWindow = GetWindowDC(hWnd);
>>>> HDC hdcMemory = CreateCompatibleDC(hdcWindow);
>>>> HBITMAP hBitmap = CreateCompatibleBitmap(hdcWindow, Width, Height);
>>>> hOld = SelectObject(hdcMemory, hBitmap);
>>>> bool bResult = PrintWindow(hWnd, hdcMemory, 0);
>>>>
>>>> D3DLOCKED_RECT rect;
>>>> Tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD);
>>>> GetBitmapBits(hBitmap, Width * Height * 4, rect.pBits);
>>>> Tex->UnlockRect(0);}
>>>>
>>>> SelectObject(hdcMemory, hOld);
>>>> DeleteObject(hBitmap);
>>>> DeleteDC(hdcMemory);
>>>> ReleaseDC(hWnd, hdcWindow);
>>>> }
>>>>
>>>> Thanx in advance.
>>>> _______________________________________________
>>>> so mailing list
>>>> so at cursuri.cs.pub.ro
>>>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>>>>
>>>>
>>>
>>>
>>> --
>>> Cibo
>>>
>>> _______________________________________________
>>> so mailing list
>>> so at cursuri.cs.pub.ro
>>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>>>
>>>
>>>
>
> --
>
> _______________________________________________
> so mailing list
> so at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/so
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20090616/725929b3/attachment.htm>
More information about the so
mailing list