m); //lParam的意义可看MSDN中WM_KEYDOWN部分 } } } return CallNextHookEx( hHook, nCode, wParam, lParam ); } 抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的DLL,登记热键,因此需要将hook.lib添加到工程里,在程序里给出两个DLL函数的定义,也可以写个头文件,再包含进来以下代码:
BOOL __declspec(dllexport)__stdcall AddHotkey(HWND,UCHAR key,UCHAR mask); BOOL __declspec(dllexport)__stdcall DeleteHotkey(HWND,UCHAR key,UCHAR mask); 为了添加应用程序对热键通知事件的响应,程序中用的办法是重载WindowProc()函数,该函数代码如下:
LRESULT CCaptureDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if(message==WM_HOTKEY&&lParam==WM_KEYDOWN) { //lParam表示是按下还是松开,如果有多个热键,由wParam来区分 SaveBmp(); return FALSE; } …… //其它处理及默认处理 } 将屏幕图像保存到BMP文件中的任务是由函数SaveBmp()来完成的,具体实现参见代码部分。另外为了顺利实现屏幕抓图,程序中还实现了"托盘"功能,由于这一部分本书在实例中已经专门介绍过了,所以不再赘述,读者朋友可以参考相关实例。
最后需要提醒读者朋友们注意的是,源程序的编译与使用时要先编译hook.dll并将其放在系统目录(win2000/NT是system32,98/ME是system),然后编译对话框程序运行即可。 二、编程步骤
1、 启动Visual C++,生成一个DLL项目和一个基于对话框的应用程序项目,并将两个项目分别命名为"Hook"和"Capture";
2、 在"Hook"项目中导出AddHotkey()、DeleteHotkey()函数;
3、 在"Capture"项目中按照图一所示设置对话框的界面,具体设置参见代码部分;
4、 使用Class Wizard在"Capture"项目中添加按钮的鼠标单击消息响应函数,并重载对话框的WindowProc()函数;
5、 添加代码,编译运行程序。 三、程序代码
/////////////////////// Hook.h : main header file for the HOOK DLL #if !defined(AFX_HOOK_H__AEBFF705_C93A_11D5_B7D6_0080C82BE86B__INCLUDED_) #define AFX_HOOK_H__AEBFF705_C93A_11D5_B7D6_0080C82BE86B__INCLUDED_ #if _MSC_VER > 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 symbols class CHookApp : public CWinApp { public: CHookApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHookApp) public: vir
|