Ściąganie obrazu z monitora

0

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.

0

najłatwiej jest chyba nacisnąć programowo klawisz Print Screen
później w schowku masz obraz i go obsługujesz jak chcesz

0
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).

0
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 chcesz

Moż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

0

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...

0

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

0
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ź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1