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