Parody Napisano Grudzień 7, 2018 Autor Zgłoś Udostępnij Napisano Grudzień 7, 2018 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 :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Grudzień 8, 2018 Zgłoś Udostępnij Napisano Grudzień 8, 2018 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Parody Napisano Grudzień 8, 2018 Autor Zgłoś Udostępnij Napisano Grudzień 8, 2018 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 :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Grudzień 8, 2018 Zgłoś Udostępnij Napisano Grudzień 8, 2018 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; Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.