Skocz do zawartości

Okno do bitmapy albo JPG :)


Parody

Recommended Posts

Witam.
Potrzebuję zrobić "printscreen" okna aplikacji (uchwyt okna pobieram przez FindWindowEx), zapisać go jako BMP albo nawet lepiej jako JPG i nie bardzo wiem jak się do tego zabrać :(, okno prawdopodobnie wykorzystuje DirectDraw ale wolałbym jakiś "uniwersalny" sposób. Z góry tlx. Za pomoc :)

Link do komentarza
Udostępnij na innych stronach

Aby skopiowac cokolwiek z ekranu wystarczy urzyc nastepujacego algorytmu:

var
 dc,screen:hDC;
 bm:HBITMAP;
begin
 screen:=getdc(0);
 bm:=createcompatiblebitmap(screen,200,200); //200 to np. rozmiar wyskosci i szerokosci kopiowanego okna
 dc:=createcompatibledc(screen);
 selectobject(dc,bm);
 bitblt(dc,0,0,200,200,screen,50,50,SRCCOPY); //50 to polozenie okna (x,y)
 releasedc(0,screen);
 ...

i bm jest uchwytem zrzuconej mapy. A jezeli chcesz pobrac polozenie okna wystarczy zastosowac GetWindowRect.

Link do komentarza
Udostępnij na innych stronach

A więc po przeróbce kod działa ale pojawiły się 2 nowe problemy :(
1. Czy idzie jakoś pobrać obraz okna zasłoniętego (na razie pobiera mi obraz każdego okna nad nim)
2. Dlaczego po paru odrysowaniach okno nie przyjmuje komunikatu WM_PAINT (nie odrysowuje się) tu kawałek kodu :

...
        case WM_PAINT:
                hWndH3 = FindWindowEx(NULL,NULL,NULL,"Heroes of Might and Magic III");
        if (hWndH3==NULL)
        {
                MessageBox(NULL,"Brak okna Gry !","Błąd",MB_OK);
                PostQuitMessage(0);
        }
        GetWindowRect(hWndH3,&rozOkna);
                memset(&bitMapa,0,sizeof(HBITMAP));
                DCScreenH3 = GetDC(hWndH3);
                bitMapa=CreateCompatibleBitmap(DCScreenH3,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top);
                DCH3=CreateCompatibleDC(DCScreenH3);
                SelectObject(DCH3,bitMapa);
                BitBlt(DCH3,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,DCScreenH3,0,0,SRCCOPY);
                DeleteDC(DCH3);
                DeleteDC(DCScreenH3);
                hdc=BeginPaint(hWnd,&ps);               
                memDC=CreateCompatibleDC(hdc);
                SelectObject(memDC,bitMapa);
        //      BitBlt(hdc,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,memDC,0,0,SRCCOPY);
                StretchBlt(hdc,0,0,400,400,memDC,0,0,rozOkna.right-rozOkna.left,rozOkna.bottom-rozOkna.top,SRCCOPY);
                EndPaint(hWnd,&ps);
                DeleteDC(memDC);
                DeleteDC(hdc);
                UpdateWindow(hWnd);
                hWndH3=NULL;
                break;
        case WM_TIMER:
                InvalidateRect(hWnd,NULL,true);
                break;
...

[UPDATE]
Problem nr 2 rozwiązałem poprzez usuwanie bitmapy po kazdym rysowaniu :)

Link do komentarza
Udostępnij na innych stronach

Czy sie da skopiowac przyslonietego okna to niewiem, bo nie probowalem. Ale ogolnie, to nie jestem pewien czy da sie tak standardowo skopiowac obraz odrysowywany przez DirectX. Pierwsza uwaga to za duzo tego kodu w WM_PAINT. Powinien byc tylko kod do odrysowania, a nie tez do pokazania komunikatow. No i ten UpdateWindow w tym komunikacie? Poza tym zrobiles zegar i komunikat chyba nie zdazy takiej ilosci wykonac naraz - zalezne jest to od sprzetu i jaki zadales interwal czasowy na SetTimer. WM_Paint poiwnien prawidlowo wygladac tak:

WM_PAINT:begin
 dc:=beginpaint(okno,ps);
 ... //tutaj kod do odrysowania. Odrysowujac na oknie masz kontekst dc, lub ps.hdc. zawsze jak tworzysz nowekonteksty w pamieci to pamietaj aby je na koncu zwalniac. Jezeli odrysowujesz ciagle te same okno to po co naokraglo odwolywac sie do niego w tym komunikacie. Wystarczy raz pobrac np. w WM_CREATE i np. w zegarze sprawdzac czy caly czas jest. Bo jesli nie to po co wywlywac odrysowanie okna poprzez InvalidateRect?
 endpaint(okno,ps);
end;
Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...