C++屏幕抓图代码- 抓取屏幕 保存位图
扫描二维码
随时随地手机看文章
本程序是利用通用的热键管理DLL 实现的热键功能,在收到热键通知后截取屏幕的内容并保存到BMP 文件中。编译并运行本例程序,单击【浏览…】按钮可以改变保存文件的路径,而单击【设置】按钮则可以改变截取屏幕的热键。
实现方法和思路:在一个DLL(热键管理DLL)中安装一个键盘钩子,用另一个程序(Capture)通过这个DLL 来增加、修改、删除热键。当用户按了抓取屏幕的热键后,热键管理DLL 通知Capture 抓取屏幕,并保存位图。下面来看程序代码:
1.制作热键管理DLL
这个DLL 实际上是一个键盘钩子,由它来监视系统的键盘事件。如果有和程序登记符合的按键和按键组合就通知该程序的窗口。为了应用方便,把它做成了一个标准的管理库来为其他的程序通过热键服务,它有两个输出函数AddHotkey 和DeleteHotkey,程序只需要调用这两个函数即可,如果编译之后不用改变热键,则只需要AddHotkey 即可。
(1)全局变量:所有的全局变量都放在一个共享段中,定义如下:
1
#pragma
data_seg("shareddata")
2
HHOOK
hHook
=NULL;
//钩子句柄
3
UINT
nHookCount
=0;
//挂接的程序数目
4
static
UCHAR
HotKey[MAX_KEY]
= {0};
//热键虚拟键码
5
static
UCHAR
HotKeyMask[MAX_KEY]
= {0};
//组合掩码,
control=4,alt=2,shift=1
6
static
HWND
hCallWnd[MAX_KEY]
= {0};
//window
handle associated with hotkey
7
static
int
KeyCount
=0;
8
static
UCHAR
MaskBits=0;
//00000
Ctrl=4&Alt=2&Shift=1
9
#pragma
data_seg()
关于共享段,有几点重要的说明:
A. 第一种必须在链接选项里指定该段为共享, projectsettingslinkobject/library , 加上/section:shareddata,rws。
B.第二种指定共享段的方法:在DLF 文件的sections 里加上一句shareddata read write shared。
C. 另外还有第三种指定共享段的方法: 需要在程序里加上一句“ #pragma comment(linker,"section:shareddata,rws")”。
D.所有的变量必须初始化,否则链接程序会把它放到普通数据段。
E.如果不初始化变量,需要在段外用“__declspec(allocate("shareddata")) 变量类型 变量名”的方式定义。
(2)两个输出函数:
01
//添加热键
02
BOOL
__declspec
(
dllexport
)
__stdcall AddHotkey(
HWND
hWnd,
UCHAR
cKey,
UCHAR
cMask)
03
<code class="plain" style="margin:0px!important; padding:0px!important; border:0px!important; outline:0px!important; float:none!important; vertical-align:baseline!important; position:static!important; left:auto!important; top:auto!important; right:auto!important; bottom:auto!important; height:auto!important; width:auto!important; line-height:1.1em!important; font-family:Consolas,'Bitstream Vera Sans M