Screenshot von Fenstern machen ?



  • Hallo,

    ich würde gerne wissen wie ich screenshots von anderen Fenstern machen kann.
    Ich habe bereits einen Code dafür geschrieben nur dummerweise fotografiert der nicht das fenster selber sondern nur den Teil des Desktops an dem sich das Fenster befindet, sprich wenn das Fenster verdeckt ist, minimiert ist oder ein bisschen aus dem Desktop raussteht, wird es nicht für meine Zwecke gut genug fotografiert.

    Hier mein Code:

    HDC srcDC = GetDC(m_hWnd);
    	RECT r;
    	GetWindowRect(m_hWnd, &r);
    	int w = r.right-r.left; 
    	int h = r.bottom-r.top; 
    	int wTex = 512;
    	int hTex = 512;
    
    	// Create DCs
    	HDC wndDC = CreateCompatibleDC(srcDC);
    	HDC hdcCompatible = CreateCompatibleDC(srcDC);
    
    	//	Create A Temporary Bitmap
    	BITMAPINFO	bi = {0};												// The Type Of Bitmap We Request
    	DWORD		*pBits = 0;												// Pointer To The Bitmap Bits
    
    	bi.bmiHeader.biSize			= sizeof(BITMAPINFOHEADER);				// Set Structure Size
    	bi.bmiHeader.biBitCount		= 32;									// 32 Bit
    	bi.bmiHeader.biWidth		= wTex;							// Power Of Two Width
    	bi.bmiHeader.biHeight		= hTex;						// Make Image Top Up (Positive Y-Axis)
    	bi.bmiHeader.biCompression	= BI_RGB;								// RGB Encoding
    	bi.bmiHeader.biPlanes		= 1;									// 1 Bitplane
    
    	//	Creating A Bitmap This Way Allows Us To Specify Color Depth And Gives Us Imediate Access To The Bits
    	HBITMAP hbmpTemp = CreateDIBSection(hdcCompatible, &bi, DIB_RGB_COLORS, (void**)&pBits, 0, 0);
    
    	// create contents of texture
    	SelectObject(hdcCompatible, hbmpTemp);
    	StretchBlt(hdcCompatible, 0, 0, wTex, hTex, srcDC, 0, -25, w-5, h-5, SRCCOPY);
    
    	// Convert From BGR To RGB Format And Add An Alpha Value Of 255
    	for(long i = 0; i < wTex * hTex; i++)				// Loop Through All Of The Pixels
    	{
    		BYTE* pPixel	= (BYTE*)(&pBits[i]);							// Grab The Current Pixel
    		BYTE  temp		= pPixel[0];									// Store 1st Color In Temp Variable (Blue)
    		pPixel[0]		= pPixel[2];									// Move Red Value To Correct Position (1st)
    		pPixel[2]		= temp;											// Move Temp Value To Correct Blue Position (3rd)
    
    		// This Will Make Any Black Pixels, Completely Transparent		(You Can Hardcode The Value If You Wish)
    		pPixel[3]=(pPixel[0]+pPixel[1]+pPixel[2])/3;
    	}
    
    	glEnable(GL_TEXTURE_2D);
    	glGenTextures(1, &m_texid);											// Create The Texture
    
    	// Typical Texture Generation Using Data From The Bitmap
    	glBindTexture(GL_TEXTURE_2D, m_texid);								// Bind To The Texture ID
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);		// (Modify This For The Type Of Filtering You Want)
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);     // (Modify This For The Type Of Filtering You Want)
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wTex, hTex, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBits);	// (Modify This If You Want Mipmaps)
    
    	// Clean up
    	DeleteObject(hbmpTemp);												// Delete The Object
    	DeleteDC(wndDC);
    	DeleteDC(hdcCompatible);
    

    Habe die OpenGL-Befehle drinnen gelassen um ein mein bestreben ein bisl klarer zu machen: ich will die grafischen inhalte der Fenster nachher in eine OGL-Textur zwängen.

    Hoffe mir kann jemand helfen.

    PS: Die Kommentare einfach nich beachten wenn sie müll sind -> copy&paste-zeug aus alten code von mir



  • neq schrieb:

    Ich habe bereits einen Code dafür geschrieben nur dummerweise fotografiert der nicht das fenster selber sondern nur den Teil des Desktops an dem sich das Fenster befindet, sprich wenn das Fenster verdeckt ist, minimiert ist oder ein bisschen aus dem Desktop raussteht, wird es nicht für meine Zwecke gut genug fotografiert.

    Hilft dir jetzt zwar nicht wirklich weiter, aber ich bezweifle, ob man so direkt an den Fensterinhalt eines verdeckten Fensters kommt (ohne dieses wiederherzustellen bzw. zu verschieben).



  • Evtl. funzt es ja WM_PRINT an das entsprechende Fenster zu senden...



  • Wenn es erst ab w2k gehen soll ist "PrintWindow" genau das was Du suchst.



  • sehr schöne Lösung dankeschön



  • Jochen Kalmbach (off) schrieb:

    Wenn es erst ab w2k gehen soll ist "PrintWindow" genau das was Du suchst.

    Sorry... nicht W2k sondern XP :p



  • Also laut MSDN sollte WM_PRINT genau das selbe machen. Funzt aber unter jedem Windows. (Ab 95 😉 )

    Greetz



  • WM_PRINT hat nur den grossen Nachteil, dass es die entsprechende Anwendung auch implementieren muss... und das machen nun mal die wenigsten...



  • Ahh gut - dann entschuldige ich mich für den Kommentar. Dachte das ist per DefWndProc abgefangen.

    Greetz


Anmelden zum Antworten