screenshot
-
hallo
Wie mache ich ein screenshot des desktops ?
Im jpg dateiformat.?Nerd
-
Screenshot vom Desktop, gespeichert in einer BMP-Datei (nach jpg musst du selber gucken):
void ScreenShotDesktop() { 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); char sError[128]; if(!::BitBlt(memDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY)) { //ERROR } 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 = 32 * nWidth * nHeight / 8; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; if(!::GetDIBits( memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS)) { //ERROR } 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); if(!SetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS)) { wsprintf(sError,"Error: SetDIBits (Code %i)\r\n",GetLastError()); OutputDebugString(sError); } // BitBlt(*hDC, 0, 0, GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN)-1,memDC, 0, 0, SRCCOPY); HANDLE hfile = CreateFile( "__TMP__SCRNSHOT__2357__.BMP", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 ); if(hfile==INVALID_HANDLE_VALUE) { //ERROR } 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); ::DeleteDC(hdc); ::DeleteObject(hbm); ::DeleteObject(hbmOld); ::DeleteObject(hWnd); hbm=NULL; hbmOld=NULL; delete[] pbBits; }
-
Hi
in C hätte ich das gerne. !
Nerd
-
nerd-- schrieb:
Hi
in C hätte ich das gerne. !
Nerd
Das ist C (mit WinAPI selbstverständlich). Was stört dich denn daran?
-
Ist es doch, bis auf ein new & delete
-
Note schrieb:
Ist es doch, bis auf ein new & delete
Ach stimmt, hab ich übersehen.
Dann machst du da halt malloc/free draus und gut is'...
-
_matze schrieb:
Note schrieb:
Ist es doch, bis auf ein new & delete
Ach stimmt, hab ich übersehen.
Dann machst du da halt malloc/free draus und gut is'...
+ Scope-Operator
-
Wofür brauchst du die screenshots, im eigenen Programm zum weiteren Einsatz? Wenn du die nur ausserhalb des Programmes brauchst, z.B. für Dokumentationszwecke, empfiehlt sich besser der Einsatz eines geeigneten Bildbearbeitungsprogrammes. Zu nennen wäre Photoimpact, der macht das und kann selbst von BMP nach JPG umwandeln. Kann sehr viel eigene Arbeit ersparen.
-
In Vista und Win7 ist das Snipping Tool ein geniales Bordwerkzeug.
-
Hi
Nein möchte eine Highlevel funktion die mir ein Screenshot macht ! Das in C und der API, auch Dritt-Library's erwünscht !
Programme die eine Konvertierung vornehmen, oder Bildbearbeitungs Programme, habe ich so viele das es mich erschlägt ! Nei, Scherz bei seite.
Matze hat ein guten Ansatz gebracht. Doch leider ist das nicht reines C !
Das ist jedenfals nicht C.
-> ::CreateCompatibleDC(hdc);
Wohl eine Funktion der Api. Doch die funktionen ruft man da ohne " :: " auf.
Und zum schluss.... Ich wollte so oder so eine Funktion die mir eine JPG Datei erstellt !
lowbyte_
-
Hi
Alles was ich Probiert habe hier ist mull ! syntaxfehler etc.
Hier 2 Stunden müssame Arbeit.
Ohne Syntaxfehler. Für C and C++;int main() { HDC hdc; HWND hWnd; hWnd = GetDesktopWindow(); hdc = GetDC(hWnd); dc2bitmap(hdc, 1680, 1050, "c:\\hallo.BMP"); return 0; } void dc2bitmap(HDC hdc, int width, int height, char *filename) { HDC hdc2; HBITMAP aBmp; BITMAPINFO bi; HGDIOBJ OldObj; void *dibvalues; HANDLE fileHandle; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; DWORD bytes_write; DWORD bytes_written; hdc2=CreateCompatibleDC(hdc); 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; //bmih.biSizeImage=(3*bmih.biHeight*bmih.biWidth); //bmih.biSizeImage = 0; bi.bmiHeader=bmih; aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL); if (aBmp==NULL) { OutputDebugString("CreateDIBSection failed!\n"); return 0; } OldObj=SelectObject(hdc2,aBmp); BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY); 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; fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if (fileHandle==INVALID_HANDLE_VALUE) { OutputDebugString("CreateFile failed!\n"); return 0; } // Write the BITMAPFILEHEADER bytes_write=sizeof(BITMAPFILEHEADER); if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); return 0; } //Write the BITMAPINFOHEADER bytes_write=sizeof(BITMAPINFOHEADER); if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); return 0; } //Write the Color Index Array??? bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth; 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; }
lowbyte