C++ Code:
#include <windows.h>#include <iostream>#include <fstream>#include <chrono>#include <ctime>typedef struct{ HBITMAP hBmp
; int Width
, Height
; unsigned int* Pixels
; unsigned short BitsPerPixel
;} BmpData
;bool ScreenShot
(BmpData
&Data
, HDC DC
){ bool Result
= false; memset(&Data
, 0, sizeof(Data
)); HDC hdcMem
= CreateCompatibleDC
(DC
); Data.
Width = GetDeviceCaps
(DC
, HORZRES
); Data.
Height = GetDeviceCaps
(DC
, VERTRES
); unsigned char* Pixels
= NULL
; unsigned short BitsPerPixel
= 32; BITMAPINFO Info
= {{sizeof(BITMAPINFOHEADER
), Data.
Width, -Data.
Height, 1, BitsPerPixel
, BI_RGB
, 0, 0, 0, 0, 0}}; Data.
hBmp = CreateDIBSection
(DC
, &Info
, DIB_RGB_COLORS
, reinterpret_cast
<void**>(&Pixels
), NULL
, 0); if(Data.
hBmp) { HBITMAP hOld
= reinterpret_cast
<HBITMAP
>(SelectObject
(hdcMem
, Data.
hBmp)); BitBlt
(hdcMem
, 0, 0, Data.
Width, Data.
Height, DC
, 0, 0, SRCCOPY
); SelectObject
(hdcMem
, hOld
); Data.
Height *= -1; Data.
BitsPerPixel = BitsPerPixel
; Data.
Pixels = reinterpret_cast
<unsigned int*>(Pixels
); Result
= true; } DeleteDC
(hdcMem
); return Result
;}/*Portable way to save a bitmap =)*/void SaveBitmap
(const char* FilePath
, const BmpData
&Data
){ std
::fstream hFile
(FilePath
, std
::ios::out | std
::ios::binary); if (!hFile.
is_open()) { printf("%s", "Error. Cannot Create Bitmap."); return; } unsigned int Trash
= 0; unsigned short Planes
= 1; unsigned int biSize
= 40; unsigned short Type
= 0x4D42; unsigned int compression
= 0; unsigned int PixelsOffsetBits
= 54; int Width
= Data.
Width; int Height
= -Data.
Height; unsigned short BitsPerPixel
= Data.
BitsPerPixel; unsigned int size
= ((Width
* BitsPerPixel
+ 31) / 32) * 4 * Height
; unsigned int bfSize
= 54 + size
; Height
*= -1; hFile.
write(reinterpret_cast
<char*>(&Type
), sizeof(Type
)); hFile.
write(reinterpret_cast
<char*>(&bfSize
), sizeof(bfSize
)); hFile.
write(reinterpret_cast
<char*>(&Trash
), sizeof(unsigned int)); hFile.
write(reinterpret_cast
<char*>(&PixelsOffsetBits
), sizeof(PixelsOffsetBits
)); hFile.
write(reinterpret_cast
<char*>(&biSize
), sizeof(biSize
)); hFile.
write(reinterpret_cast
<char*>(&Width
), sizeof(Width
)); hFile.
write(reinterpret_cast
<char*>(&Height
), sizeof(Height
)); hFile.
write(reinterpret_cast
<char*>(&Planes
), sizeof(Planes
)); hFile.
write(reinterpret_cast
<char*>(&BitsPerPixel
), sizeof(BitsPerPixel
)); hFile.
write(reinterpret_cast
<char*>(&compression
), sizeof(compression
)); hFile.
write(reinterpret_cast
<char*>(&size
), sizeof(size
)); hFile.
write(reinterpret_cast
<char*>(&Trash
), sizeof(unsigned int)); hFile.
write(reinterpret_cast
<char*>(&Trash
), sizeof(unsigned int)); hFile.
write(reinterpret_cast
<char*>(&Trash
), sizeof(unsigned int)); hFile.
write(reinterpret_cast
<char*>(&Trash
), sizeof(unsigned int)); hFile.
write(reinterpret_cast
<char*>(Data.
Pixels), size
); hFile.
close();}std
::chrono::time_point<std
::chrono::high_resolution_clock> SystemTime
(){ return std
::chrono::high_resolution_clock::now();}float FloatTimeDuration
(std
::chrono::time_point<std
::chrono::high_resolution_clock> Time
){ return std
::chrono::duration<float
>(SystemTime
() - Time
).
count() * 1000.0f;}unsigned int TimeDuration
(std
::chrono::time_point<std
::chrono::high_resolution_clock> Time
){ return std
::chrono::duration_cast<std
::chrono::milliseconds>(SystemTime
() - Time
).
count();}int main
(){ HWND MyWindow
= nullptr
; //Handle to the window that you want to screenshot.. BmpData data
; HDC Screen
= GetDC
(MyWindow
); //Get a DC.. auto Time
= SystemTime
(); ScreenShot
(data
, Screen
); std
::cout<<"It took: "<<FloatTimeDuration
(Time
)<<"ms to take a screenshot!\n"; SaveBitmap
("C:/Users/Brandon/desktop/Foo.bmp", data
); DeleteDC
(Screen
); DeleteObject
(data.
hBmp);}