|
屏幕截图 |
• 简单屏幕截图,存为 png 图片 |
• 屏幕截图时隐藏窗口,屏幕截图存为 png 图片 |
• 使用快捷键屏幕截图,屏幕截图存为 png 图片 |
本文内容用到的头文件:
类/模板 |
描述 |
头文件 (XE2 之后) |
头文件 (XE 之前) |
TPngImage |
.png 图片 |
#include <Vcl.Imaging.pngimage.hpp> |
#include <pngimage.hpp> |
TBitmap |
.bmp 图片/位图 |
#include <Vcl.Graphics.hpp> |
#include <Graphics.hpp> |
std::auto_ptr |
自动指针 |
#include <memory> |
#include <memory> |
简单屏幕截图,存为 png 图片
void __fastcall TForm1::Button16Click(TObject *Sender)
{
std::auto_ptr<TBitmap>bmp(new TBitmap);
HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
if(hdcScreen)
{
try
{
bmp->PixelFormat = pf32bit;
bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height,
hdcScreen, 0,0, SRCCOPY);
}
__finally
{
DeleteDC(hdcScreen);
}
}
std::auto_ptr<TPngImage>png(new TPngImage);
png->Assign(bmp.get());
png->SaveToFile(L"d:\\snapshot.png");
}
|
屏幕截图时隐藏窗口,屏幕截图存为 png 图片
void __fastcall TForm1::Button17Click(TObject *Sender)
{
std::auto_ptr<TBitmap>bmp(new TBitmap);
HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
if(hdcScreen)
{
try
{
bmp->PixelFormat = pf32bit;
bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
WindowState = wsMinimized;
Visible = false;
::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height,
hdcScreen, 0,0, SRCCOPY);
Visible = true;
WindowState = wsNormal;
SetForegroundWindow(Handle);
}
__finally
{
DeleteDC(hdcScreen);
}
}
std::auto_ptr<TPngImage>png(new TPngImage);
png->Assign(bmp.get());
png->SaveToFile(L"d:\\snapshot.png");
}
|
使用快捷键屏幕截图,屏幕截图存为 png 图片
.h 文件增加的内容 |
private:
int iHotKeyID;
unsigned short uSnapIndex;
protected:
void __fastcall WndProc(Messages::TMessage &Message);
|
.cpp 文件增加的内容 |
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
iHotKeyID = 1; // 快捷键的 ID:1 【注1】
uSnapIndex = 0; // 屏幕截图保存的文件名的序号【注2】
RegisterHotKey(Handle, iHotKeyID, MOD_CONTROL|MOD_ALT, L'P'); // ID:1 注册的快捷键为 Ctrl + Alt + P
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
UnregisterHotKey(Handle, iHotKeyID); // 注销 ID:1 的快捷键
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if(Message.Msg == WM_HOTKEY) // 如果 Windows 消息为快捷键
{
WORD wMod = Message.LParamLo; // Ctrl, Alt, Shift 和 Win 键的状态
WORD wKey = Message.LParamHi; // 快捷键的虚拟按键码
if(wMod==(MOD_CONTROL|MOD_ALT) && wKey==L'P') // Ctrl + Alt + P
{
std::auto_ptr<TBitmap>bmp(new TBitmap); // 创建内存位图 bmp,先把屏幕截图放在内存位图里面
// Copyright © Victor Chen, http://www.cppfans.com/
HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); // 这是所有的显示器拼接在一起的整体的 DC 【注3】
if(hdcScreen)
{
try
{
bmp->PixelFormat = pf32bit; // bmp 的像素格式为 32 位
bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES), // bmp 的宽度 = DC 的宽度
GetDeviceCaps(hdcScreen, VERTRES)); // bmp 的高度 = DC 的高度
::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height, // 显示内容复制到这个 DC 的这个位置
hdcScreen, 0,0, SRCCOPY); // 从这个 DC 的这个位置复制显示内容
}
__finally
{
DeleteDC(hdcScreen); // 释放屏幕 DC 占用的资源
}
}
std::auto_ptr<TPngImage>png(new TPngImage); // 新创建一个 png 图片
png->Assign(bmp.get()); // bmp 转为 png
png->SaveToFile(String().sprintf(L"d:\\Snapshot%05u.png",uSnapIndex++)); // 保存截图为 png 图片
}
}
TForm::WndProc(Message); // 必须调用默认的 Windows 消息处理
}
//--------------------------------------------------------------------------- |
注:
1.
快捷键的 ID, 对于 exe 文件,可以在 0x0000 ~ 0xBFFF 之间随意选择一个整数值,但是必须保证注册的每个快捷键对应不同的 ID
2. 屏幕截图保存的文件名为 "Snapshot00000.png", "Snapshot00001.png", "Snapshot00002.png", ……这样的格式
3. 这是所有显示器拼接在一起的整体的 DC,如果需要单个显示器的内容,需要用 EnumDisplayDevices 函数枚举所有的显示设备
|
|
|
|