Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ Program to take a screenshot

I am making a program that will click the printscreen key of the keyboard. The code I am using is the following:

INPUT myInput;

myInput.type = INPUT_KEYBOARD;

KEYBDINPUT keyboardInput;
keyboardInput.wScan = 0;
keyboardInput.dwFlags = 0;
keyboardInput.time = 0;
keyboardInput.dwExtraInfo = 0;
keyboardInput.wVk = VK_SNAPSHOT; 
myInput.ki = keyboardInput;

SendInput(1, &myInput, sizeof(INPUT));//pressing the printscreen key

keyboardInput.dwFlags = KEYEVENTF_KEYUP;
myInput.ki = keyboardInput;

SendInput(1, &myInput, sizeof(INPUT));//releasing the printscreen key

for some reason the code doesn't work what so ever. If I go to paint and try to paist from clipboard, it will only past whatever printscreen I had done before I had used my program. Also my keyboard doesn't need me to press the "alt" with the print screen in order for it to work..

I had tryed to included the pressing of the Alt key beeeforee the pressing of the printscreen key, as well as the release of the Alt key afffftterr the releasing of the printscreen key, and the difference I got was that when I tried to past it on paint, I paist some kind of a full black screen... This was just a test I did to see if it makes a difference, but my actual keyboard takes screenshots with only the hit of the print screen button.

Any ideas on what I am doing wrong guys?

Edited: just to let you guys know, the program does in fact compile. I have also added other code that saves the clipboard file to a directory, and I do save a file correctly if I manually hit the print screen button... but if I keep looping this code with the saving to a directory, the same picture of the manually obtained screenshot appears... so that is how I know for sure that there is a problem with the hitting of the printscreen button.

like image 976
rsthegreat12 Avatar asked Jul 27 '14 20:07

rsthegreat12


People also ask

How do you take a screenshot in C?

Click the Capture button or press Ctrl-Shift-C. Then, click and drag the crosshairs to select part or all of your screen.

How do I take a screenshot using CMD?

First off all open cmd in full screen mode then click on print screen button after that open paint brush and press ctrl + v (past) you can save it in any where, where ever you want (file type should be . png).

How do I print screen with Windows 10?

Press Ctrl + PrtScn keys. The entire screen changes to gray including the open menu. Select Mode, or in earlier versions of Windows, select the arrow next to the New button. Select the kind of snip you want, and then select the area of the screen capture that you want to capture.


2 Answers

That is code for taking a screenshot in BMP and to convert it to JPG:

void TakeScreenShot(const std::string& path)
{
//setting to the screen shot
keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

//handler of the bitmap that save the screen shot
HBITMAP hBitmap;

//I have to give for it time to make it work
Sleep(100);

//take the screen shot
OpenClipboard(NULL);

//save the screen shot in the bitmap handler 
hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);

//relese the screen shot
CloseClipboard();

std::vector<BYTE> buf;
IStream *stream = NULL;
HRESULT hr = CreateStreamOnHGlobal(0, TRUE, &stream);
CImage image;
ULARGE_INTEGER liSize;

// screenshot to jpg and save to stream
image.Attach(hBitmap);
image.Save(stream, Gdiplus::ImageFormatJPEG);
IStream_Size(stream, &liSize);
DWORD len = liSize.LowPart;
IStream_Reset(stream);
buf.resize(len);
IStream_Read(stream, &buf[0], len);
stream->Release();

// put the imapge in the file
std::fstream fi;
fi.open(path, std::fstream::binary | std::fstream::out);
fi.write(reinterpret_cast<const char*>(&buf[0]), buf.size() * sizeof(BYTE));
fi.close();
}
like image 87
יהונתן יפרח Avatar answered Oct 14 '22 02:10

יהונתן יפרח


On the windows platform: You have to follow a certain sequence of simulated key presses.

The code below is a simulates keybd_event() keyboard events and puts the captured screen into the clipboard.

#include <iostream>
#include <windows.h>
using namespace std;



int main()
{
    keybd_event(VK_MENU, 0, 0, 0); //Alt Press
    keybd_event(VK_SNAPSHOT, 0, 0, 0); //PrntScrn Press


    keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0); //PrntScrn Release
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); //Alt Release

return 0;
}
like image 40
Software_Designer Avatar answered Oct 14 '22 03:10

Software_Designer