C++ - Screenshot

Diskutiere C++ - Screenshot im Developer Network Forum im Bereich Hardware & Software Forum; Hi. Ich habe mir ein Programm "zusammengebastelt", das einen Screenshot macht und in einer Datei speichern. Allerdings werden nur 75% des...
  • C++ - Screenshot Beitrag #1
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hi.
Ich habe mir ein Programm "zusammengebastelt", das einen Screenshot macht und in einer Datei speichern.

Allerdings werden nur 75% des Bildschirms aufgenommen. Der restliche Bereich bleibt schwarz!


Hier ist der Code:
Code:
#include <windows.h>
const char *AppName="Yeah";

void SaveScreen(HWND pScreen, char Path[])
{
	int     Width  = GetSystemMetrics(SM_CXSCREEN);
	int     Height = GetSystemMetrics(SM_CYSCREEN);

    HDC hdcScreen;
    HBITMAP hbmScreen;
 
 
    //---------------Bitmap Informationen
    BITMAPINFO infobmp;
    infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    infobmp.bmiHeader.biWidth = Width;
    infobmp.bmiHeader.biHeight = Height;
    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) + Width*Height*3 + sizeof(BITMAPINFOHEADER);
    bfheader.bfReserved1 = 0;
    bfheader.bfReserved2 = 0;
    bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    //Bitmap -----------------------      Informationen
 
 
    hdcScreen = GetWindowDC(pScreen);
    hbmScreen = CreateCompatibleBitmap(hdcScreen,Height, Width);
 
    // temporärer DC
    HDC hdcTemp = CreateCompatibleDC( hdcScreen );
 
    // Bitmap reinselektieren
    HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen );
 
    // Inhalt von Desktop übertragen
    BitBlt( hdcTemp, 0, 0, Height, Width, hdcScreen, 0, 0, SRCCOPY );
 
    int iResult = GetDIBits(hdcTemp,hbmScreen,0,Height,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,Width*Height*3,&word,NULL);
 
    ReleaseDC(pScreen,hdcScreen);
    CloseHandle(hfile);
    delete[] bitmap;
}

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{	
	HWND hWnd = FindWindow(NULL, AppName); 


	char *path="Z:/neu.bmp";
	Sleep(1000);
	SaveScreen(hWnd, path);

	return 0;
}


Ich habe auch schon mal das
Code:
int     Width  = GetSystemMetrics(SM_CXSCREEN);
int     Height = GetSystemMetrics(SM_CYSCREEN);
durch
Code:
int     Width  = 1280;
int     Height = 1024;
Wobei dann das Ergebnis genauso falsch ist:



Würde mich sehr freuen, wenn mir jemand helfen kann!:goil:
 
  • C++ - Screenshot Beitrag #2
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Meine spontane Idee wäre, dass hier: "void SaveScreen(HWND pScreen, char Path[])", Parameter "pScreen", ein falscher Wert übergeben wird. Evtl. Nicht links oben angesetzt.
 
  • C++ - Screenshot Beitrag #3
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Also denkst du das FindWindow das Problem ist:
Code:
HWND hWnd = FindWindow(NULL, AppName);
Code:
HWND FindWindow(      
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName
);
lpClassName
[...]
If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter.

lpWindowName
[in] Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.
Wenn ich jetzt aber als 2. Parameter auch noch NULL angebe, bleibt alles schön schwarz.:no:


FindWindow(NULL, AppName);


Man sieht nur ~75%!


FindWindow(NULL, NULL);

Da ist gar nix!

Ich versteh das nicht! Mein Verdacht war auch das hWnd, aber wo ist der Fehler?!
 
  • C++ - Screenshot Beitrag #4
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Ich würde mal spontan dieses
Code:
    int* bitmap = new int[1024*768*3];
als Problem vermuten.
 
  • C++ - Screenshot Beitrag #5
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hui, das habe ich übersehen!

Code:
int* bitmap = new int[Width*Height*3];
Danke Cmddegi!

Leider schaut das Resultat immer noch gleich aus. Es Fehlt das rechte Virtel!
 
Zuletzt bearbeitet:
  • C++ - Screenshot Beitrag #6
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Habe mir Deinen Code mal genauer angesehen. Du hast an 2 Stellen Width und Height vertauscht (CreateCompatibleBitmap und BitBlt).
 
  • C++ - Screenshot Beitrag #7
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
UnimatixZero:got:, du bist dein Gewicht in Gold wert!:res:
Danke, danke, danke, danke, jetzt gehts!:goil:

Vielen Dank natürlich auch an Cmddegi!;)



Falls einer den nun berichtigten Code habe will:
Code:
/* <Include> */
#include <windows.h>
/* </Include> */

/* <Const> */
const char *AppName="Yeah";
/* </Const> */

/* <Function> */
void SaveScreen(HWND pScreen, char Path[])
{
	int     Width  = /*GetSystemMetrics(SM_CXSCREEN)*/1280;
	int     Height = /*GetSystemMetrics(SM_CYSCREEN)*/1024;

    HDC hdcScreen;
    HBITMAP hbmScreen;
 
 
    //---------------Bitmap Informationen
    BITMAPINFO infobmp;
    infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    infobmp.bmiHeader.biWidth = Width;
    infobmp.bmiHeader.biHeight = Height;
    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[Width*Height*3];
 
    BITMAPFILEHEADER bfheader;
     
    bfheader.bfType = 19778;
    bfheader.bfSize = sizeof(BITMAPFILEHEADER) + Width*Height*3 + sizeof(BITMAPINFOHEADER);
    bfheader.bfReserved1 = 0;
    bfheader.bfReserved2 = 0;
    bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    //Bitmap -----------------------      Informationen
 
 
    hdcScreen = GetWindowDC(pScreen);
    hbmScreen = CreateCompatibleBitmap(hdcScreen, Width, Height);
 
    // temporärer DC
    HDC hdcTemp = CreateCompatibleDC(hdcScreen);
 
    // Bitmap reinselektieren
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcTemp, hbmScreen);
 
    // Inhalt von Desktop übertragen
    BitBlt(hdcTemp, 0, 0, Width, Height, hdcScreen, 0, 0, SRCCOPY);
 
    int iResult = GetDIBits(hdcTemp, hbmScreen, 0, Height, 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, Width*Height*3, &word,NULL);
 
    ReleaseDC(pScreen, hdcScreen);
    CloseHandle(hfile);
    delete[] bitmap;
}
/* </Function> */

int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{	
	HWND hWnd = FindWindow(NULL, AppName);


	char *path="Z:/neu.bmp";
	Sleep(1000);
	SaveScreen(hWnd, path);

	return 0;
}
 
Zuletzt bearbeitet:
  • C++ - Screenshot Beitrag #8
P

PowerUser42

Neues Mitglied
Dabei seit
18.01.2013
Beiträge
1
Reaktionspunkte
0
Zwar schon sehr alt der Thread aber ich habe einen Fehler gefunden.
Code:
int* bitmap = new int[Width*Height*3];
muss
Code:
char* bitmap = new char[Width*Height*3];
sein oder byte, etc
Es wird als void* übergeben. Mit dem int* passieren schlimme Dinge^^. Da werden dann 4 Farben in einem int-wert gespeichert. Mit char* hat man für jedes pixel dann 3 byte bzw 3 Farbwerte von 0-255.
 
Thema:

C++ - Screenshot

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.171
Mitglieder
55.876
Neuestes Mitglied
RamiroGarn
Oben