Moi miten otetaa screenshotti windoussissa ja kielion sit c++
Käyttöjärjestelmällä ei taida olla merkitystä...
No, jos käyttöjärjestelmä ei ole tiedossa... mielellää toimis useammallaki
Käyttöjärjestelmällä nimenomaan on merkitystä. Screenshot otetaan kutsumalla käyttöjärjestelmäsi API:n tämän toimenpiteen toteuttavaa funktiota. Tutki Windowsin kehittäjän dukumentaatiota ja etsi mikä tämä funktio sattuu Windowssin tapauksessa olemaan.
Tässä olisi yksi (purkalla) toimiva funktio:
void TakeScreenShot(char* filename){ keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); HBITMAP h; OpenClipboard(NULL); h = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); HDC hdc=NULL; FILE*fp=NULL; LPVOID pBuf=NULL; BITMAPINFO bmpInfo; BITMAPFILEHEADER bmpFileHeader; do{ hdc=GetDC(NULL); ZeroMemory(&bmpInfo,sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize =sizeof(BITMAPINFOHEADER); GetDIBits(hdc, h,0,0,NULL, &bmpInfo, DIB_RGB_COLORS); if(bmpInfo.bmiHeader.biSizeImage<=0) bmpInfo.bmiHeader.biSizeImage =bmpInfo.bmiHeader.biWidth* abs(bmpInfo.bmiHeader.biHeight)* (bmpInfo.bmiHeader.biBitCount+7)/8; if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) ==NULL){ break; } bmpInfo.bmiHeader.biCompression=BI_RGB; GetDIBits(hdc,h,0, bmpInfo.bmiHeader.biHeight, pBuf, &bmpInfo, DIB_RGB_COLORS); if((fp = fopen(filename,"wb"))==NULL){ break; } bmpFileHeader.bfReserved1=0; bmpFileHeader.bfReserved2=0; bmpFileHeader.bfSize =sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ bmpInfo.bmiHeader.biSizeImage; bmpFileHeader.bfType='MB'; bmpFileHeader.bfOffBits= sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER); fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, fp); fwrite(&bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp); fwrite(pBuf, bmpInfo.bmiHeader.biSizeImage, 1, fp); } while(false); if(hdc)ReleaseDC(NULL,hdc); if(pBuf) free(pBuf); if(fp)fclose(fp); }
Elikkä tuo funktio ottaa parametrina osoittimen char-merkkijonoon ja luo merkkijonon nimisen tiedoston, joka sisältää kuvakaappauksen. Purkkaa tuo on sen takia että funktio 'painaa' printscreen-näppäintä saadakseen kuvan. Ei varmastikkaan paras mahdollinen toteutus, mutta toimii.
Jos tarkoitus on saada omasta ohjelmasta screenshot, keinot riippuvat lähinnä käytetystä grafiikkarajapinnasta. Esimerkiksi SDL:llä tilanne on helppo, kun voi vain tallentaa näyttöpinnan SDL_SaveBMP-funktiolla. OpenGL:ssä voi hieman vastaavasti kopioida ja tallentaa piirretyn kuvan.
Windows SDK:ssa pystyy lukitsemaan työpöydän kahva ja sitten käyttämään sitä grafiikkapintana sekä lukuun että myös kirjoitukseen. Joka windows ohjelmalla on oma kahva (handle) jota SDK grafiikassa käytetään joten niillä luulisi selviävän.
GetDesktopWindow( )
”The GetDesktopWindow function returns a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which all icons and other windows are painted.”
Aihe on jo aika vanha, joten et voi enää vastata siihen.