利用VC++开发屏幕抓图程序实列

上传人:cl****1 文档编号:431495144 上传时间:2023-12-24 格式:DOC 页数:18 大小:190KB
返回 下载 相关 举报
利用VC++开发屏幕抓图程序实列_第1页
第1页 / 共18页
利用VC++开发屏幕抓图程序实列_第2页
第2页 / 共18页
利用VC++开发屏幕抓图程序实列_第3页
第3页 / 共18页
利用VC++开发屏幕抓图程序实列_第4页
第4页 / 共18页
利用VC++开发屏幕抓图程序实列_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《利用VC++开发屏幕抓图程序实列》由会员分享,可在线阅读,更多相关《利用VC++开发屏幕抓图程序实列(18页珍藏版)》请在金锄头文库上搜索。

1、利用VC+开发屏幕抓图程序实列作者:未知 文章来源:网络在Windows操作系统中,当用户按下PrintScreen按钮后,Windows自动将当前屏幕的图像 拷贝到系统剪贴板中,这时可以通过”画笔这个小程序将剪贴板中的内容保存成图像文件,可以看出,如果需要将当前屏幕保存下来还是比较麻烦的,能否可以自己编写一个应用程序,自动将当前屏幕的内容保存到一个图像文件中去呢?这个答案是肯定的,本实例应用程序就是利用通用的热键管理 DLL库实现的热键功能,在收到热键通知后截取屏幕的内容并保存 到bmp文件中。例如我们设置图片保存路径为c:,热键为F9 + Control,然后按Change按钮设置好热键,

2、那么当我们按下CTRL+F9后,当前界面将以 BMP图像文件的格式被保存在C:目录下。、实现方法热键管理DLL实际上是一个键盘钩子,由它来监视系统的键盘事件。如果有和程序登记符合的按键组合就通知该程序的窗口。为了应用方便,本实例把它做成了一个标准的管理库来为其它的程序通过热键服务,它有两个输出函数:AddHotkey ()和DeleteHotkey(),程序只需要调用这两个函数就可以了,如果编译之后不用改变热键,则只需要AddHotkey就可以了。DLL中的所有的全局变量都放在一个共享段中,定义如下:#pragma data_seg(shareddata)HHOOK hHook =NULL;

3、/ 钩子句柄UINT nHookCount =0; /挂接的程序数目static UCHAR HotKeyMAX_KEY = 0; / 热键虚拟键码static UCHAR HotKeyMaskMAX_KEY = 0; /组合掩码,control=4,alt=2,shift=1static HWND hCallWndMAX_KEY = 0; /win dow han dle associated with hotkeystatic int KeyCo unt =0;static UCHAR MaskBits =0; /00000 Ctrl=4 & Alt=2 & Shift=1#pragma

4、data_seg()关于共享段,有几点重要的说明:一是必须在链接选项里指定该段为共享:一种方法是在 project-settings-link-object/library 中加上 /section:shareddata,rws ;第二种方法是在 def 文件的sections里加上一句 shareddata read write shared;第三种指定共享段的方法在程序里 加上一句 #pragma comment(linker,section:shareddata,rws)。二是所有的变量必须初始化,否 则链接程序会把它放到普通数据段。三是如果不初始化变量,需要在段外用_declspec(

5、allocate(shareddata)变量类型变量名”的方式定义。DLL中的两个输出函数分别用来添加/删除热键,函数代码如下:BOOL _declspec(dllexport) _stdcall AddHotkey(HWND hWnd,UCHAR cKey,UCHAR cMask)BOOL bAdded=FALSE; for(int index=0;indexMAX_KEY;index+) if(hCallWndindex=0) hCallWndindex=hWnd; HotKeyindex=cKey; HotKeyMaskindex=cMask; bAdded=TRUE; KeyCount

6、+; break;return bAdded;/删除热键BOOL _declspec(dllexport) _stdcall DeleteHotkey(HWND hWnd,UCHAR cKey,UCHAR cMask)BOOL bRemoved=FALSE;for(int index=0;indexMAX_KEY;index+) if(hCallWndindex=hWnd) if(HotKeyindex=cKey&HotKeyMaskindex=cMask) hCallWndindex=NULL; HotKeyindex=0;HotKeyMaskindex=0; bRemoved=TRUE;K

7、eyCount-;break;return bRemoved;DLL 中的钩子函数如下:LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) BOOL bProcessed=FALSE; if(HC_ACTION=nCode) if(lParam&0xc0000000)=0xc0000000)/ 有键松开 switch(wParam)case VK_MENU:MaskBits&=ALTBIT;break;case VK_CONTROL:MaskBits&=CTRLBIT;break;case VK_SHIFT:

8、MaskBits&=SHIFTBIT;break;default: /judge the key and send messagebreak;for(int index=0;indexMAX_KEY;index+) if(hCallWndindex=NULL) continue;if(IsWindow(hCallWndindex)&(HotKeyindex=wParam)&(HotKeyMaskindex=Mask Bits) SendMessage(hCallWndindex,WM_HOTKEY,wParam,WM_KEYUP); bProcessed=TRUE;else if(lParam

9、&0xc000ffff)=1) / 有键按下 switch(wParam)case VK_MENU:MaskBits|=ALTBIT;break;case VK_CONTROL:MaskBits|=CTRLBIT;break;case VK_SHIFT:MaskBits|=SHIFTBIT;break;default: /judge the key and send messagebreak;for(int index=0;indexMAX_KEY;index+) if(hCallWndindex=NULL) continue;if(IsWindow(hCallWndindex)&(HotKe

10、yindex=wParam)&(HotKeyMaskindex=Mask Bits)SendMessage(hCallWndindex,WM_HOTKEY,wParam,WM_KEYDOWN); bProcessed=TRUE;if(!bProcessed) / 一般按键事件,为监视键盘的程序留出余地 for(int index=0;index 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include resource.h / main symbolsclass CHookAp

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号