Screenshot machen
-
geeky schrieb:
Das hWnd des Desktops ist NULL

Wenn dir NULL zu doof aussieht kannste auch HWND_DESKTOP nehmen
Ne nicht wirklich...
GetDesktopWindow()
-
Theseus schrieb:
Hier bekomme ich folgende Fehler-Meldung trotz Inkludierung von Windows.h:
Operands of = have incompatible types 'struct HDC__ *' and 'int'.
Ich versteh das nicht, da mir mein Code völlig legitim erscheint.
MfgDie Funktion heißt GetDC
.
-
Lol danke, da bin ich auch grad draufkommen komisch war mir fast sicher dass es Dc wär.
Hmmm k mein Code funzt und erstellt auch ein bmp nur ist dieses leider fehlerhaft.
Da ich bestimmte Segmente übernommen habe kann es sein, dass manche Vars angepasst werden müsswen kA.
Es gibt keine Fehlermeldungen.
Hier mal der Code, wär nett wenn ihr mir da helfen könntet.
#include <windows.h> int 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,0); 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; } int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { RECT rt; HWND hWnd; hWnd=GetDesktopWindow(); int width, height = 0; HDC hdc= GetDC(hWnd); GetWindowRect(hWnd,&rt); width=rt.right-rt.left; height=rt.top-rt.bottom; dc2bitmap(hdc, width, height,"kazuum.bmp" ); return 0; }
-
Ah ok FUNZT YUHU!
Hab mich gespielt und jetzt gehts.
Hier mal der kompilerbare Source um Screenshots zu machen (sicher was für die FAQ weil das ja oft gefragt wird)
#include <windows.h> int 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,0); 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; } int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { RECT rt; HWND hWnd; hWnd=GetDesktopWindow(); int width, height = 0; HDC hdc= GetDC(hWnd); GetWindowRect(hWnd,&rt); width=rt.right-rt.left; height=rt.bottom-rt.top; dc2bitmap(hdc, width, height,"kazuum.bmp" ); return 0; }
-
Nur noch ne letzte wichtige Frage bitte (auch wenn ich nerve
).Wenn ich das jetzt versenden will muss ich das bitweise versenden oder reicht fscanf??
Lg
-
Hmm merk grad ich hab mich da ganz blöd ausgedrückt, was ich sagen wollte:
Wenn ich diese Datei lesen will muss ich sie bitweise lesen oder reicht fscanf()?
-
Man kann nicht bitweise lesen, nur byteweise. Ja du kannst die Standard-C-Funktionen dafür verwenden.
-
Vergiss bitte dass es jemals irgendwo eine Funktion gegeben hat die auf "scanf" endet. Nur so als Tip. Die "*scanf" Familie ist der blanke Horror. Nimm fread() oder eine andere ehrbahre Funktion, aber lass die Finger von fscanf.
-
Danke für den Tipp, ich werde ihn beherzigen.
-
wenn ich den code verwende kommen haufenweise error meldungen
zb:
MGDIOBJ << nicht erklärt erst benutzen!
hdc << nicht erklärt erst benutzen!und so geht es weiter

-
Also das ist sicherlich nichts fürs FAQ, weil dort schon drinsteht wie man einen DC in eine Bitmap speichert... un der Rest ist das einfachste auf der Welt -.-
-
He
ich hab den Code mal ausprobiert aber ich krieg immer CreateDIBSection failed
als Fehler.Weiß jeamnd was das sein könnt?
MFG Pacino