Pixel scan

07/25/2013 16:29 Doktor.#1
Hey, weiß jemand evtl. wie man mit einer Form einen bestimmten Pixel Bereich eines externen Programm's[Game] abspeicher könnte und dann in der Form anzeigen oder direkt vom anderen Programm die Pixel auf die Form übertragen könnte?

Falls ihr es nicht verstanden habt, hier noch mal in Bilder:

z.B. so ein Ausschnitt aus einem Spiel auslesen mit einer Form
[Only registered and activated users can see links. Click Here To Register...]

und dann in der Form wiedergeben
[Only registered and activated users can see links. Click Here To Register...]


Hoffe einer weis wie oder ob das gehen würde^.
07/25/2013 17:19 .SkyneT.#2
Google -> how to make a screenshot in c++
Quote:
Use GetDC(NULL); to get a DC for the entire screen.
Use CreateCompatibleDC to get a compatible DC.
Use CreateCompatibleBitmap to create a bitmap to hold the result.
Use SelectObject to select the bitmap into the compatible DC.
Use BitBlt to copy from the screen DC to the compatible DC.
Deselect the bitmap from the compatible DC.
07/26/2013 11:39 taigatenshi#3
Da dein Topic Pixel scan heist
->
Quote:
// Eine Bitmap von dem erstellen was du grade sehen kannst
Bitmap myBitmap = Win32APICall.GetDesktop();
//jetzt kannst du von dem bildschirm den bereich auslesen den du haben magst
for (int x = startposX; x < endposX; x++)
for(int y = startposY; y < endposY; y++)
auschnitt.setPixel(x-startpos, y-startpos,myBitmap.getPixel(x,y));
hab den Code nicht getestet aber in der Richtung dürftest du eine Bitmap mit deinem schnipsel vom Bildschirm erstellen können. wie du die Koordinaten und die Größe herbekommst sei deine Sache.
ps: die Bitmap kannst du einfach in die Picture laden
pictureBox1.setImage(BITMAP);
07/26/2013 21:29 Doktor.#4
Ok, hab soweit alles, es wird ein Bild alle 100ms erstellt und auch angezeigt aber nur das erst erstellte Bild die picturebox updatet sich nicht, selbst wenn es in einer while schleife geschieht, weis wer Rat?
07/26/2013 22:47 Excepti0n#5
Quote:
Originally Posted by marbra1 View Post
Ok, hab soweit alles, es wird ein Bild alle 100ms erstellt und auch angezeigt aber nur das erst erstellte Bild die picturebox updatet sich nicht, selbst wenn es in einer while schleife geschieht, weis wer Rat?
Zeig deinen Code, dann könnte man dir weiterhelfen.
07/26/2013 23:04 Doktor.#6
Programm das die bmp erstellt

Code:
	ic::con.setTitle(L"Bla bla");

	HWND capture = FindWindow(0, L"Test"); 



while(true)
{
	RECT rect; 
	GetWindowRect(capture, &rect); 
	size_t dx = 244;
	size_t dy = 48;



	BITMAPINFO info; 
	info.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER); 
	info.bmiHeader.biWidth         = dx; 
	info.bmiHeader.biHeight        = dy; 
	info.bmiHeader.biPlanes        = 1; 
	info.bmiHeader.biBitCount      = 24; 
	info.bmiHeader.biCompression   = BI_RGB; 
	info.bmiHeader.biSizeImage     = 0; 
	info.bmiHeader.biXPelsPerMeter = 0; 
	info.bmiHeader.biYPelsPerMeter = 0; 
	info.bmiHeader.biClrUsed       = 0; 
	info.bmiHeader.biClrImportant  = 0; 



	HBITMAP bitmap = 0; 
	BYTE*   memory = 0; 

	HDC device = GetDC(capture); 
	bitmap = CreateDIBSection(device, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0); 
	ReleaseDC(capture, device); 

	HDC winDC = GetWindowDC(capture); 
	HDC memDC = CreateCompatibleDC(winDC); 
	SelectObject(memDC, bitmap); 
	BitBlt(memDC, 0, 0, dx, dy, winDC, 0, 0, SRCCOPY); 
	DeleteDC(memDC); 
	ReleaseDC(capture, winDC); 

	char *buffer = {"Npm.bmp"}; 

	basic_ofstream<char> file(buffer, ios::binary); 

	BITMAPFILEHEADER fileHeader; 
	BITMAPINFOHEADER infoHeader; 

	fileHeader.bfType      = 0x4d42; 
	fileHeader.bfSize      = 0; 
	fileHeader.bfReserved1 = 0; 
	fileHeader.bfReserved2 = 0; 
	fileHeader.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 

	infoHeader.biSize          = sizeof(infoHeader); 
	infoHeader.biWidth         = dx; 
	infoHeader.biHeight        = dy; 
	infoHeader.biPlanes        = 1; 
	infoHeader.biBitCount      = 24; 
	infoHeader.biCompression   = BI_RGB; 
	infoHeader.biSizeImage     = 0; 
	infoHeader.biXPelsPerMeter = 0; 
	infoHeader.biYPelsPerMeter = 0; 
	infoHeader.biClrUsed       = 0; 
	infoHeader.biClrImportant  = 0; 

	file.write((char*)&fileHeader, sizeof(fileHeader)); 
	file.write((char*)&infoHeader, sizeof(infoHeader)); 

	int wbytes = (((24*dx + 31) & (~31))/8); 
	int tbytes = (((24*dx + 31) & (~31))/8)*dy; 
	file.write((char*)memory, tbytes); 

	DeleteObject(bitmap); 
	bitmap = 0; 
	memory = 0;

	Sleep(50);
}
Code vom Timer der Form, der es aktualisieren soll
Code:
	private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e) {
				 
				 pictureBox1->Image = Image::FromFile("Npm.bmp");

			 }
e/ Ok, hab das Problem, das Bild wird zwar neugeladen, aber es wird von dem anderen Programm nicht aktualisiert daher bleibt das alte Bild, da es von der Form benutzt wird. Weiß wer dazu ne Lösung?
07/27/2013 07:49 Tyrar#7
Quote:
Originally Posted by marbra1 View Post
Code:
	private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e) {
				 
				 pictureBox1->Image = Image::FromFile("Npm.bmp");

			 }
[Only registered and activated users can see links. Click Here To Register...]
07/27/2013 14:46 Padmak#8
[Only registered and activated users can see links. Click Here To Register...]

Ich glaube, dass das tatsächlich sein Ernst ist.. Wenn ja -> das ist ja furchtbar :O
Lass das, dieses hässliche C++/CLI nervt nur

Padmak
07/27/2013 16:08 Bl@ze!#9
Quote:
Originally Posted by Padmak View Post
[Only registered and activated users can see links. Click Here To Register...]

Ich glaube, dass das tatsächlich sein Ernst ist.. Wenn ja -> das ist ja furchtbar :O
Lass das, dieses hässliche C++/CLI nervt nur

Padmak
Das passt einfach nicht :p
08/03/2013 16:21 .Lol#10
Quote:
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e)
{

pictureBox1->Image = Image::FromFile("Npm.bmp");

}
Wenn du nach CLR>CLI Klassen/Funktionen/Beispielen im Internet suchst findest du fast nichts (selbst in der MSDN-Bibliothek kaum).
Ich empfehle dir nach C# Beispielen zu suchen, diese lassen sich mit ein paar Änderungen fast immer in C++/CLR übertragen.

z.B. von [Only registered and activated users can see links. Click Here To Register...]

Quote:
BITMAPINFO info;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = dx;
info.bmiHeader.biHeight = dy;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 24;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biSizeImage = 0;
info.bmiHeader.biXPelsPerMeter = 0;
info.bmiHeader.biYPelsPerMeter = 0;
info.bmiHeader.biClrUsed = 0;
info.bmiHeader.biClrImportant = 0;
Wenn du schon CLR>CLI benutzt dann solltest du auch die Klassen aus dem namespace "System::Drawing" benutzen.

Quote:
Lass das, dieses hässliche C++/CLI nervt nur
Ja CLR ist schon hässlich, aber wenn man schnell ein Programm schreiben will, dass man wahrscheinlich nur 1 mal benutzt ist es leichter mit CLR (oder einer anderen Prog. Sprache) zu arbeiten als sich durch 50 Bibliotheken zu beißen.

// Bin selbst kein CLR pro. habe ws nur aus ein paar code snippets "gelernt"
08/03/2013 17:29 Padmak#11
Quote:
Originally Posted by .Lol View Post
Wenn du nach CLR>CLI Klassen/Funktionen/Beispielen im Internet suchst findest du fast nichts (selbst in der MSDN-Bibliothek kaum).
Ich empfehle dir nach C# Beispielen zu suchen, diese lassen sich mit ein paar Änderungen fast immer in C++/CLR übertragen.
Warum sollte man das tun wollen? Es gibt C# und es gibt C++, für was braucht man da einen (hässlichen) Hybriden? :/

Padmak
08/04/2013 15:22 Tyrar#12
Quote:
Originally Posted by Padmak View Post
Warum sollte man das tun wollen? Es gibt C# und es gibt C++, für was braucht man da einen (hässlichen) Hybriden? :/

Padmak
Manche Menschen wollen die Welt einfach nur brennen sehen.