В Windows 7 есть такая утилита для работы с областью скриншота — «Ножницы» (Snipping Tool). И хоть лично я этой утилитой толком не пользовался, но многим из моих знакомых она приходилась по нраву. Со временем в Windows 10 этот инструмент претерпел некоторые изменения, появились всплывающие сообщения (на закрытие которых каждый раз приходилось терять время, фактически — лишний клик мышкой) призывающие перейти на другой фирменный инструмент взамен удаляемых из состава Windows «Ножниц». Обычно все ставят сторонние приложения которые и нажатие клавиши PrtScr перехватят, и полученный скриншот в какую-нибудь помойку зальют, но в коммерческой среде применимость подобного ПО под большим вопросом. По просьбе одного человека я сделал простое альтернативное решение, оно срабатывает по нажатию на клавишу Print Screen.

Решение отнюдь не претендует на элегантность, но свою задачу выполняет. Использовался C++ Builder:

#include <vcl.h>
#pragma hdrstop
#include ″Unit.h″
#include <jpeg.hpp> // Необходим для работы с JPEG
#pragma package(smart_init)
#pragma resource ″*.dfm″
TMainForm *MainForm;

String PaintPath, ScrPath;

Регистрируем PrtScr (код 0x2C) в качестве хоткея нашего приложения. Именно хоткея, прямой необходимости ставить хук нет. Далее формируем строку (она должна быть объявлена как глобальная переменная) где указан путь к файлу — его мы будем писать в директорию пользователя. Эта директория доступна для записи даже в том случае, если наше приложение будет запущено из-под ограниченной учетной записи. Еще одна строка — исполняемый файл MS Paint и передача ему пути к файлу скриншота в качестве аргумента запуска. Получается что-то вроде такого:

__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner)
{

RegisterHotKey(Handle,0,NULL,0x2C);

ScrPath=″C:\\Users\\″+Username()+″\\AppData\\Roaming\\SCR.jpg″;
PaintPath=″mspaint.exe ″+ScrPath;

}

Имя текущего пользователя узнаем отдельной функцией:

String Username()
{

char* buf = (char*)malloc(sizeof(char)*256);
memset(buf, ‘ ‘, 256);
DWORD nSize = 256;
GetUserName(buf, &nSize);
return AnsiString(buf).Trim();

}

Теперь напишем процедуру сохранения скриншота:

void Shoot()
{

Graphics::TBitmap* bm = new Graphics::TBitmap();
TJPEGImage* JPEG = new TJPEGImage();
HDC dc=GetWindowDC(GetDesktopWindow());
bm->Height = Screen->DesktopHeight;
bm->Width = Screen->DesktopWidth;
BitBlt(bm->Canvas->Handle,0,0,WIDTH, HEIGHT, dc,0,0, SRCCOPY);
JPEG->Assign(bm);
JPEG->CompressionQuality = 90; // Уровень сжатия
JPEG->Compress();
JPEG->SaveToFile(ScrPath);
delete bm;
delete JPEG;
return;

}

Осталось только обработать нажатие клавиши PrtScr:

void __fastcall TMainForm::OnHotKey(TMessage& msg)
{

Shoot();
MainForm->Caption=″Gotcha!″;
WinExec(PaintPath.c_str(),SW_NORMAL);

}

Если все сделано правильно, то при нажатии на клавишу PrtScr (если, конечно, наше приложение запущено) будет сохранен скриншот в пользовательскую директорию — и тут же открыт в MS Paint. Дальше уже можно оперативно выделить нужную область и скопировать её в буфер обмена (или сохранить в отдельный файл). Бинарник можно забрать здесь.