Screenshot in C++
-
Hallo!
Ich habe hier ein Programm aus mehreren zusammengeschnitten. Es sollte ein Screenshot machen und als BMP speichern, aber es funktioniert nicht.. könnt ihr mir helfen?
[/cpp]
/*screen capture example*/
#include <windows.h>
#include <fstream>
#include <stdio.h>
#include <wingdi.h>
#include <fstream.h>#define SCREENWIDTH GetSystemMetrics(SM_CXSCREEN)
#define SCREENHEIGHT GetSystemMetrics(SM_CYSCREEN)HBITMAP g_hDeskBmp;
HDC g_hMemDC;
int g_nDCdata;int main()
{
/*capture desktop and store for later use*/
HDC hdcDesk;
hdcDesk=GetDC(HWND_DESKTOP); /*equivalent to hdcDesk=GetDC((HWND)0);*/
g_hMemDC=CreateCompatibleDC(0);
g_hDeskBmp=CreateCompatibleBitmap(hdcDesk, SCREENWIDTH, SCREENHEIGHT);
/*fill the bitmap with contents of desktop*/
g_nDCdata=SaveDC(g_hMemDC);
SelectObject(g_hMemDC,g_hDeskBmp);
BitBlt(g_hMemDC, 0, 0, SCREENWIDTH, SCREENHEIGHT,hdcDesk,0,0,SRCCOPY);//......................................................................................
// create the BMP file
// create output file
ofstream bmpfile("d:\\filename.bmp");
// save bitmap file header
BITMAPFILEHEADER fileHeader;
fileHeader.bfType = 0x4d42;
fileHeader.bfSize = 0;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);if(!bmpfile.write((char*)&fileHeader, sizeof(fileHeader)))
return 0;// save bitmap info header
BITMAPINFOHEADER infoHeader;
infoHeader.biSize = sizeof(infoHeader);
infoHeader.biWidth = 800;
infoHeader.biHeight = 600;
infoHeader.biPlanes = 1;
infoHeader.biBitCount = 32;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = 0;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biClrUsed = 0;
infoHeader.biClrImportant = 0;if(!bmpfile.write((char*)&infoHeader, sizeof(infoHeader)))
return 0;// save color table (sample used here is 8-bit grayscale)
if(infoHeader.biBitCount == {
RGBQUAD table[256];
for(size_t i = 0; i < 256; i++)
table[i].rgbRed = table[i].rgbGreen = table[i].rgbBlue = (BYTE)i;
if(!bmpfile.write((char*)table, 256*sizeof(RGBQUAD)))
return 0;
}
else if(infoHeader.biBitCount == 4) {
// 16 colors
}
else if(infoHeader.biBitCount == 1) {
// only two colors (doesn't necessarily have to be always black and white!)
}// save bitmap data
if(!bmpfile.write((char*)&hdcDesk, sizeof(hdcDesk)))
return 0;ReleaseDC(HWND_DESKTOP,hdcDesk);
RestoreDC(g_hMemDC,g_nDCdata);
DeleteDC(g_hMemDC);
DeleteObject(g_hDeskBmp);// close the file
return 0;
//......................................................................................
}
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
// get desktop window (but can be any window) HWND capture = GetDesktopWindow(); if(!IsWindow(capture)) return 1; // get window dimensions RECT rect; GetWindowRect(capture, &rect); size_t dx = rect.right - rect.left; size_t dy = rect.bottom - rect.top; // create BITMAPINFO structure // used by CreateDIBSection BITMAPINFO info; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biWidth = dx; info.bmiHeader.biHeight = dy; info.bmiHeader.biPlanes = 1; info.bmiHeader.biBitCount = 24; info.bmiHeader.biCompression = BI_RGB; info.bmiHeader.biSizeImage = 0; info.bmiHeader.biXPelsPerMeter = 0; info.bmiHeader.biYPelsPerMeter = 0; info.bmiHeader.biClrUsed = 0; info.bmiHeader.biClrImportant = 0; // a bitmap handle and a pointer its bit data HBITMAP bitmap = 0; BYTE* memory = 0; // create bitmap HDC device = GetDC(capture); bitmap = CreateDIBSection(device, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0); ReleaseDC(capture, device); if(!bitmap || !memory) return 1; // blit the contents of the desktop (winDC) // to the bitmap (selected in memDC) HDC winDC = GetWindowDC(capture); HDC memDC = CreateCompatibleDC(winDC); SelectObject(memDC, bitmap); BitBlt(memDC, 0, 0, dx, dy, winDC, 0, 0, SRCCOPY); DeleteDC(memDC); ReleaseDC(capture, winDC); char *buffer; sprintf(buffer,"capture%d%d.bmp",dx,dy); // create bitmap file basic_ofstream<char> file(buffer, ios::binary); if(!file) { DeleteObject(bitmap); return 1; } // initialize bitmap file headers BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; fileHeader.bfType = 0x4d42; fileHeader.bfSize = 0; fileHeader.bfReserved1 = 0; fileHeader.bfReserved2 = 0; fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); infoHeader.biSize = sizeof(infoHeader); infoHeader.biWidth = dx; infoHeader.biHeight = dy; infoHeader.biPlanes = 1; infoHeader.biBitCount = 24; infoHeader.biCompression = BI_RGB; infoHeader.biSizeImage = 0; infoHeader.biXPelsPerMeter = 0; infoHeader.biYPelsPerMeter = 0; infoHeader.biClrUsed = 0; infoHeader.biClrImportant = 0; // save file headers file.write((char*)&fileHeader, sizeof(fileHeader)); file.write((char*)&infoHeader, sizeof(infoHeader)); // save 24-bit bitmap data int wbytes = (((24*dx + 31) & (~31))/8); int tbytes = (((24*dx + 31) & (~31))/8)*dy; file.write((char*)memory, tbytes); // delete bitmap DeleteObject(bitmap); bitmap = 0; memory = 0;
-
Danke für die Antwort, aber die folgenden Zeilen verursachen bei DevC++ einen Fehler:
// create bitmap file
basic_ofstream <char> file(buffer, ios::binary);
if(!file) { DeleteObject(bitmap); return 1; }Woran kann das liegen?
-
Oh man warum verbreitest du so einen alten Scheiss?
-
Wenn Du einen richtigen Compiler willst, dann laden VC++ 2005 Express runter. Und das ganze auch noch ganz legal...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-130812.html
-
@Amazeroth: using namespace std;
-
Jo, danke wegen dem using namespace std, aber das hab ich schon ausprobiert. Muss an was anderem liegen.. ich lade grade Visual C++ runter, wir ihrs mir empfohlen habt. Mal sehn obs dann funktioniert.
Danke an alle für die Hilfe!
-
Hallo nochmal.. ich habe Visual C++ jetzt, aber ich habe absolut keine Ahnung welche header Dateien ich benötige um das Script zu kompilieren.. windows.h gibt es nicht, welche muss ich stattdessen benutzen? Dasselbe mit iostream.h, fstream.h und wingdi.h.. Danke schonmal
-
1.) Platform SDK installieren und einrichten
2.) Die Dateien heißen iostream und fstream.
-
char* buffer = "screenshot.bmp";
dann hat bei mir alles geklappt
@Amazeroth
naja, ich glaube ich komme einpaar jahre zuspät
letzter beitrag war der 25.02.2006 ,
damals war ich 5 jahre alt
-
New Screenshot:
http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen
Save Screenshot:
https://gist.github.com/rdp/9821698
-
Ja, stimmt
char* buffer
war undefiniert.
richtig wäre gewesen:char buffer [MAX_PATH];
Ach wie schön doch ein alter Thread sein kann