`
yingyingol
  • 浏览: 745168 次
文章分类
社区版块
存档分类
最新评论

抓图程序开发实践

 
阅读更多
前言
本程序是利用通用的热键管理DLL实现的热键功能,在收到热键通知后截取屏幕的内容并保存到bmp文件中。本文提供了全部源代码供大家参考。
程序运行界面

例如我们设置图片保存路径为c:\,热键为F9 + Control,然后按Change按钮设置好热键,当我们在任意程序中按下CTRL+F9,当前界面将被保存在C:\下的BMP文件中。下面我们来看看程序的实现原理与基本结构。

一、热键管理DLL
这个DLL实际上是一个键盘钩子,由它来监视系统的键盘事件。如果有和程序登记符合的按键和按键组合就通知该程序的窗口。为了应用方便,我把它做成了一个标准的管理库来为其它的程序通过热键服务,它有两个输出函数:AddHotkey和DeleteHotkey,程序只需要调用这两个函数就可以了,如果编译之后不用改变热键,则只需要AddHotkey就可以了。

1. 全局变量

所有的全局变量都放在一个共享段中,定义如下:


关于共享段,有几点重要的说明:
a. 必须在链接选项里指定该段为共享,project->settings->link->object/library,加上/section:shareddata,rws
b. 第二种指定共享段的方法:在def文件的sections里加上一句shareddata read write shared
c. 第三种指定共享段的方法:在程序里加上一句#pragma comment(linker,"section:shareddata,rws")
d. 所有的变量必须初始化,否则链接程序会把它放到普通数据段
e. 如果不初始化变量,需要在段外用“__declspec(allocate("shareddata")) 变量类型 变量名”的方式定义

2. 两个输出函数如下


3. 钩子函数如下:


这样,热键管理的DLL就做好了,我们就可以在程序里调用AddHotkey了

二、抓图程序
抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的DLL,登记热键

1. 添加hook.lib到工程里,在程序里给出两个DLL函数的定义,也可以写个头文件,再包含进来


也可以用动态载入的办法调用

2. 添加对热键通知事件的响应,程序中用的办法是重载WindowProc


3. 保存屏幕

保存屏幕由函数SaveBmp完成,如下:


4. 界面处理。该程序为了避免热键冲突,采用了动态设置热键的方法,具体界面上的东西,可以看源程序

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics