Screenshot vom Aktivem Fenster mit Reiner WinApi
-
Hi,
Ich würde gerne Wissen wie man ein Screenshot nur vom aktivem Fenster macht.
Mit Vollbild ist das ja nicht so schwer(Habe ich schon programmiert).
Danke für Hilfreiche AntwortenMfG cobra11freak
-
Könntest du mal den Code posten, mit dem man Vollbild-Screenshot macht?
-
hier der Code:
#include <windows.h> #include <string> #include <iostream> #define _T TEXT using namespace std; class CScreenshot { private: HWND m_hDesktop; void SpeicherBildschirm(HWND pScreen, char Path[]); public: bool ScreenFull(char SavePath[]); bool ScreenFenster(char SavePath1[]); }; bool CScreenshot::ScreenFull(char SavePath[]) { m_hDesktop = GetDesktopWindow(); if(m_hDesktop == NULL) { return FALSE ; exit(1); } SpeicherBildschirm(m_hDesktop,SavePath); return TRUE; } bool CScreenshot::ScreenFenster(char SavePath[]) { //Ab da weiß ich nicht weiter return TRUE; } int main() { CScreenshot Screenshot; Screenshot.ScreenFull("C:\\screen100.bmp"); } void CScreenshot::SpeicherBildschirm(HWND pScreen, char Path[]) { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); HWND hWnd = ::GetDesktopWindow(); HDC hdc = ::GetDC(hWnd); HDC memDC = ::CreateCompatibleDC(hdc); HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm); ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nWidth; bmi.bmiHeader.biHeight = nHeight; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biBitCount * nWidth * nHeight / 8; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; ::GetDIBits( memDC, hbm, 0, bmi.bmiHeader.biHeight, pbBits, &bmi, DIB_RGB_COLORS ); BITMAPFILEHEADER bfh; bfh.bfType = ('M' << 8) + 'B'; bfh.bfSize = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); // // Hier: // HANDLE hfile = CreateFile( _T(Path), // UM DIESE ZEILE GEHT ES! GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 ); DWORD dwWritten; WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL); WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL); CloseHandle(hfile); ::SelectObject(memDC, hbmOld); ::DeleteDC(memDC); ::ReleaseDC(hWnd,hdc); ::DeleteObject(hbm); delete[] pbBits; }
-
Du könntest die Koordinaten vom aktiven Fenster holen (
GetWindowRect( GetActiveWindow(), &rct )) und diesen Teil aus dem Device-Context rausschneiden (BitBlt oder so).
-
Danke für die Antwort
Die Funktion GetWindowRect( GetActiveWindow(), &rct ) ist ja gut aber jezt weiß ich nicht wie ich dieses &rct Aufteilen soll...
Die BitBlt sieht ja so aus :BitBlt(memDC, 0, 0, Breite, Höhe, hdc, 0, 0, SRCCOPY);
-
cobra11freak schrieb:
Danke für die Antwort
Die Funktion GetWindowRect( GetActiveWindow(), &rct ) ist ja gut aber jezt weiß ich nicht wie ich dieses &rct Aufteilen soll...Wie denn aufteilen? Einfach eine Variable "rct" vom Typ "RECT" vorher deklarieren, für die Funktion wird halt nur der Zeiger übergeben, ich dachte, das wird aus dem Kontext klar.
cobra11freak schrieb:
Die BitBlt sieht ja so aus :
BitBlt(memDC, 0, 0, Breite, Höhe, hdc, 0, 0, SRCCOPY);Ich würde noch den Offset angeben, ab wo der Original-DC geblittet wird, damit du nicht nur die linke obere Ecke hast

-
Also mal langsam...
Ich hab jezt folgenden Code:void SpeicherBildschirmFENSTER(HWND pScreen, char Path[]) { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); HWND hWnd = ::GetDesktopWindow(); HDC hdc = ::GetDC(hWnd); HDC memDC = ::CreateCompatibleDC(hdc); HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm); RECT rct = ::GetWindowRect( GetActiveWindow(), &rct ) ::BitBlt(memDC, 0, 0, rct, rct, hdc, 0, 0, SRCCOPY);Und was war das andere mit der LINKEN-Ecke?
-
Badestrand schrieb:
cobra11freak schrieb:
Danke für die Antwort
Die Funktion GetWindowRect( GetActiveWindow(), &rct ) ist ja gut aber jezt weiß ich nicht wie ich dieses &rct Aufteilen soll...Wie denn aufteilen? Einfach eine Variable "rct" vom Typ "RECT" vorher deklarieren, für die Funktion wird halt nur der Zeiger übergeben, ich dachte, das wird aus dem Kontext klar.
cobra11freak schrieb:
Die BitBlt sieht ja so aus :
BitBlt(memDC, 0, 0, Breite, Höhe, hdc, 0, 0, SRCCOPY);Ich würde noch den Offset angeben, ab wo der Original-DC geblittet wird, damit du nicht nur die linke obere Ecke hast

Sag mal ist das überhaupt dein Code oder hast du den irgendwo aufgeschnappt?
-
cobra11freak schrieb:
RECT rct = ::GetWindowRect( GetActiveWindow(), &rct ) ::BitBlt(memDC, 0, 0, rct, rct, hdc, 0, 0, SRCCOPY);Entweder musst du noch mal in MSDN schauen oder du solltest doch erstmal die Grundlagen von C++ lernen. Nichts für ungut, aber wer sich an die WinAPI wagt, sollte C++ doch schon beherrschen.