Screenshot erstellen?
-
Guten morgen,
ich bin dabei ein "Programm" zu schreiben das Screenshot erstellen soll.
Volles Bildschirm, Fenster,Auswahl.Die Screenshots sollen gleich als *jpg gespeichert werden.
Ich bin noch ein Neuling auf dem Gebiet Programmieren.
Ich kann zwar schon ein Fenster mit den entsprechenden Buttons erstellen,aber ich habe überhaupt keine Ahnung welche Funktion ich nehmen soll um ein Screenshot zu erstellen.
Könnte mir jemand an Tipp geben wonach ich überhaupt suchen soll?
Danke schön.
-
geRRus schrieb:
Könnte mir jemand an Tipp geben wonach ich überhaupt suchen soll?
DC2Bitmap
ich verwende zur zeit für meine screenshots#define _WIN32_WINNT _NT5 #include <windows.h> HANDLE CreateUniqueFile(){ char path[]="c:\\var\\0000.bmp"; char* end=path+sizeof(path)-5; char* begin=end-8; HANDLE hFile; do{ char* pos=end; --pos; ++*pos; while(*pos>'9'){ *pos='0'; --pos; ++*pos; } hFile=CreateFile(path,GENERIC_READ|GENERIC_WRITE,0,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0); }while(hFile==INVALID_HANDLE_VALUE); return hFile; } int DC2Bitmap(HDC hdc,int left,int top,int width,int height,HANDLE fileHandle){ HDC hdc2=CreateCompatibleDC(hdc); BITMAPINFO bi; BITMAPINFOHEADER& bmih=bi.bmiHeader; ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); bmih.biSize=sizeof(BITMAPINFOHEADER); bmih.biHeight=height; bmih.biWidth=width; bmih.biPlanes=1; bmih.biBitCount=24; bmih.biCompression=BI_RGB; bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrImportant = 0; void *dibvalues; HBITMAP aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,0,0); if(aBmp==NULL){ OutputDebugString("CreateDIBSection failed!\n"); return 0; } HGDIOBJ OldObj=SelectObject(hdc2,aBmp); BitBlt(hdc2,0,0,width,height,hdc,left,top,SRCCOPY); BITMAPFILEHEADER bmfh; ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER); bmfh.bfType=0x4d42; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; char filename[]="c:\\var\\test.bmp"; if (fileHandle==INVALID_HANDLE_VALUE){ OutputDebugString("CreateFile failed!\n"); return 0; } DWORD bytes_write=sizeof(BITMAPFILEHEADER); DWORD bytes_written; if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)){ OutputDebugString("WriteFile failed!\n"); return 0; } bytes_write=sizeof(BITMAPINFOHEADER); if(!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)){ OutputDebugString("WriteFile failed!\n"); return 0; } bytes_write=bmih.biSizeImage; if(!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL)){ OutputDebugString("WriteFile failed!\n"); return 0; } CloseHandle(fileHandle); DeleteObject(SelectObject(hdc2,OldObj)); DeleteDC(hdc2); return 1; } int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ HWND hWnd=GetForegroundWindow(); WINDOWINFO wi; wi.cbSize=sizeof(wi); GetWindowInfo(hWnd,&wi); HDC hdc=GetWindowDC(hWnd); LONG width=wi.rcWindow.right-wi.rcWindow.left-2*wi.cxWindowBorders; LONG height=wi.rcWindow.bottom-wi.rcWindow.top-2*wi.cyWindowBorders; HANDLE hFile=CreateUniqueFile(); DC2Bitmap(hdc,wi.cxWindowBorders,wi.cyWindowBorders,width, height,hFile); return 0; }
das schießt immer nur das aktive fenster. will ich den ganzen screen schießen, darf ich eben kein aktives fenster haben. http://volkard.de/siff/0001.png und http://volkard.de/siff/0003.png
als format solltest du bei bmp bleiben. ist verlustfrei. kommt natürlich auf die inhalte an. wenn du nur photographien schießt, wo man keine texte lesen will, ist jpg am besten. sobalt text dabei sind, nimm was anderes. am besten png. mach mal die beiden screenshots im png-format von mir zu jpg und schau, ob sie noch ansehnlich sind. und vergleich die dateigrößen.
-
Hier eventuell noch ein interessanter Link für dich.
http://www.cpp-tutor.de/mfc/mfc/kap5/tut/tut4.htm
-
Vielen Dank
ich werde das mal studieren:)