Wie ktoś może jak mogę ściągać obraz z monitora? Mam na myśli taki algorytm jak w programach do robienia screenów z gier. Mam na myśli oczywiście język C.
najłatwiej jest chyba nacisnąć programowo klawisz Print Screen
później w schowku masz obraz i go obsługujesz jak chcesz
rock_player napisał(a)
najłatwiej jest chyba nacisnąć programowo klawisz Print Screen
później w schowku masz obraz i go obsługujesz jak chcesz
Może i najłatwiej, ale zauważ, że to nie zawsze chodzi (np. niektóre filmy - w miejscu filmu jest czarna dziura).
Thomashek napisał(a)
rock_player napisał(a)
najłatwiej jest chyba nacisnąć programowo klawisz Print Screen
później w schowku masz obraz i go obsługujesz jak chceszMoże i najłatwiej, ale zauważ, że to nie zawsze chodzi (np. niektóre filmy - w miejscu filmu jest czarna dziura).
hehe czarna dziura - to bedziesz miec problem bo programowo to tez chyba jest czarna dziura
jak chcesz klatke z filmu chycic to najlatwiej VirtualDubem
oto kawałek funkcji/metody z mojej klasy do operacji na plikach graficznych... nie chce mi się pisać funkcji w takiej postaci jakiej potrzebujesz ale jeśli przeanalizujesz ten kod to na pewno będziesz wstanie napisać własną. Możesz jeszcze dodać jako typ zwracany HBITMAP i utworzyć z bitów bitmapę, ja z tego zrezygnowałem bo operuje na własnym typie. Aha i jeszce jedna sprawa tam masz zmienne xPos, yPos, cx, cy. Dwie pierwsze to lewy gorny rog obszaru "zrzucanego" a cx i cy to szerokosc i wysokosc tego obszaru. Jeśli chcesz "zrzucać" cały ekran to pobierz szerokosc i wysokosc ekranu...
BYTE * epfBitmap::GetScreenBits (HWND hwnd, int xPos, int yPos)
{
HBITMAP hBitmap ;
HDC hdc, hdcMem ;
// Create HDC's
hdc = GetDC (hwnd) ;
hdcMem = CreateCompatibleDC (hdc) ;
// Create compatible bitmap
hBitmap = CreateCompatibleBitmap (hdc, cx, cy) ;
if (hBitmap == NULL)
{
DeleteDC (hdcMem) ;
ReleaseDC (hwnd, hdc) ;
return NULL ;
}
// Select the bitmap into the memory DC and copy the screen to it
SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, cx, cy, hdc, xPos, yPos, SRCCOPY);
// Calculate bytes to read
int iByteCount = cy * (((cx * iBitsPixel + 15) & ~15) >> 3) ;
// Get bitmap bits
BYTE * pBitsScr = (BYTE *) malloc (iByteCount) ;
GetBitmapBits(hBitmap, iByteCount, pBitsScr) ;
// Clean up and return pointer
DeleteDC(hdcMem) ;
ReleaseDC(hwnd, hdc) ;
if(pBitsScr == NULL)
MessageBox(NULL, TEXT("tu jest blad"), NULL, 0);
DeleteObject (hBitmap) ;
return pBitsScr ;
}
i jeśli chcesz zgrywać cały ekran to uchwyt okna możesz ustawić na NULL wtedy będzie "wskazywał" na pulpit...
czesc, mam troche podobny problem, z tym ze moj programik bierze i robi sobie bitmape z calego ekranu - pulpitu, ale mam problem takiej postaci ze chcialbym brac tez bitmape z 2 monitora, jesli taki jest podlaczony (na dualheadzie)
jak to mozna najlatwiej zrobic ?
pozdrawiam
rock_player napisał(a)
najłatwiej jest chyba nacisnąć programowo klawisz Print Screen
później w schowku masz obraz i go obsługujesz jak chcesz
Ja też tak myślałem, żeby zasymulować klawisz PrintScreen, jednak nie wiem dokładnie jak w takim wypadku obsługiwać schowek, np. żeby zgrać ten obraz jako .jpg do określonego miejsca na dysku. Interesowałoby mnie rozwiązanie tego problemu na kompilatorze Dev C++. Z góry dzięki za odpowiedź.