Screen von Fenster und teil rausschneiden
-
Zitat:
Du brauchst dazu das "hWnd" des Fensters... Frag jetzt nicht wie Du das bekommst... das musst Du selber wissen!Das weiß ich ja, aber wie mache ich davon nun ein foto?
Falsche frage. Sorry. Wie mache ich davon denn ein teilausschnitt?
-
Kopier halt einfach weniger Daten? Wo liegt genau das Problem?
Dein BitBlt() z.B. kopiert nen Bereich von 1024x768, setzt man das kleiner hat man nen kleineren Bereich kopiert?
-
Um von einem Fenster ein Screenshot zu machen, wollte ich folgenden befehl nutzen:
BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY );Wie man im Code unten sehen kann, wird der Desktop benutzt nicht das Window.
Welche Information von hier:
[img=http://img147.imageshack.us/img147/8283/winidnp2.png]
muss ich mit hdcScreen wechseln?
WinID3x ?#include <windows.h> #include <string> #include <iostream> using namespace std; class CStellwerk { private: HWND m_hDesktop; public: void MakeScreenshot(char SavePath[]); void SaveScreen(HWND pScreen, char Path[]); }; void CStellwerk::MakeScreenshot(char SavePath[]) { m_hDesktop = GetDesktopWindow(); if(m_hDesktop == NULL) { exit(1); } SaveScreen(m_hDesktop,SavePath); } int main() { CStellwerk Stellwerk; Stellwerk.MakeScreenshot("C:\\screen.bmp"); } void CStellwerk::SaveScreen(HWND pScreen, char Path[]) { HDC hdcScreen; HBITMAP hbmScreen; //---------------Bitmap Informationen BITMAPINFO infobmp; infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); infobmp.bmiHeader.biWidth = 1024; infobmp.bmiHeader.biHeight = 768; infobmp.bmiHeader.biPlanes = 1; infobmp.bmiHeader.biBitCount = 24; infobmp.bmiHeader.biCompression = 0; infobmp.bmiHeader.biSizeImage = 0; infobmp.bmiHeader.biXPelsPerMeter = 0; infobmp.bmiHeader.biYPelsPerMeter = 0; infobmp.bmiHeader.biClrUsed = 0; infobmp.bmiHeader.biClrImportant = 0; int* bitmap = new int[1024*768*3]; BITMAPFILEHEADER bfheader; bfheader.bfType = 19778; bfheader.bfSize = sizeof(BITMAPFILEHEADER) + 1024*768*3 + sizeof(BITMAPINFOHEADER); bfheader.bfReserved1 = 0; bfheader.bfReserved2 = 0; bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //Bitmap ----------------------- Informationen hdcScreen = GetWindowDC(pScreen); hbmScreen = CreateCompatibleBitmap(hdcScreen,1024,768); // temporärer DC HDC hdcTemp = CreateCompatibleDC( hdcScreen ); // Bitmap reinselektieren HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen ); // Inhalt von Desktop übertragen BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY ); int iResult = GetDIBits(hdcTemp,hbmScreen,0,768,bitmap,&infobmp,DIB_RGB_COLORS); // aufräumen SelectObject( hdcTemp, hbmOld ); DeleteObject( hbmScreen ); DeleteDC( hdcTemp ); HANDLE hfile = CreateFile( Path,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0); //Datei Schreiben DWORD word; WriteFile(hfile,&bfheader,14,&word,NULL); WriteFile(hfile,&infobmp,40,&word,NULL); WriteFile(hfile,bitmap,1024*768*3,&word,NULL); ReleaseDC(pScreen,hdcScreen); CloseHandle(hfile); delete[] bitmap; }
-
-
Auf Codeeproject gibt es dazu tonnenweise fertigen Code.
Z.B.:
http://www.codeproject.com/KB/dialog/windowsnapshot.aspx
http://www.codeproject.com/KB/graphics/screencapture.aspx
-
danke, leider aber bedient sich der code von headern die man nur bei der MFC mitbekommt. Diese besitze ich nicht und will es auch nicht extra kaufen.
Ich denke aber auch, dass mein code sehr nah an der lösung ist. Ich habe ja nun den window handle (FindWindow()), weiß nur nicht, wo ich diesen nun einsetzen muss, damit der code dieses fenster für den screenshot nutzt.
-
Ob der Code nun die MFC bedient oder nicht. Das Prinzip ist das selbe. Zudem heißen die meisten Funktionen in der MFC exakt wie Ihre WinAPI-Originale.
-
BitBlt() nimmt nen HDC, du hast nen HWND.
http://msdn.microsoft.com/en-us/library/ms533241(VS.85).aspx
-
In Zeile 100 lautet BitBlt():
BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY );Wo ist da ein HWND? Ich meine, hdcTemp und hdcScreen nutzt HDC.
-
plshelp schrieb:
Ich habe ja nun den window handle (FindWindow())[..]
Da hast du dein HWND und wie du schon bemerkt hast brauchst du bei BitBlt() ein HDC.