VC语言6.0程序设计从入门到精通-第63部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
{
HWND glhTargetWnd=pMouseHook…》hwnd; //取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄
}
·276 ·
…………………………………………………………Page 288……………………………………………………………
第 10 章 动态链接库
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption'100';
GetWindowText(glhTargetWnd;szCaption;100); //取目标窗口标题
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd;WM_SETTEXT;0;(LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd=glhTargetWnd; //保存目标窗口
}
}
return CallNextHookEx(glhHook;nCode;wparam;lparam); //继续传递消息
}
编译完成便可得到运行时所需的鼠标钩子的动态链接库 MouseHookDll。dll 和链接时用到
的 MouseHookDll。lib 。
MouseTest 是一个基于 Dialog 的 MFC 应用程序,在主对话框类的 OnInitDialog 函数的
〃TODO 注释〃后添加如下代码:
CWnd * pwnd=GetDlgItem(IDC_EDIT1); //取得编辑框的类指针
m_hook。StartHook(pwnd…》GetSafeHwnd()); //取得编辑框的窗口句柄并安装钩子
然 后 连 接 DLL 库 , 即 把 Mousehook。lib 加 入 到 项 目 设 置 链 接 标 签 中 。 然 后 把
MouseHookDll。h 和 MouseHookDll。lib 复制到 MouseHook 工程目录中,将 MouseHookDll。dll
复制到 Debug 目录下。编译执行程序即可。当鼠标滑过窗口时便会在编辑框中将此窗口的标
题显示出来。
当鼠标位于 MouseTest 的窗口内部时,显示结果如图 10…8 所示。当鼠标位于 MouseTest
窗口外部时,显示结果如图 10…9 所示,显示的鼠标当前处于的外部窗口的标题。
图 10…8 鼠标位于窗口内部时 MouseTest 的运行结果
·277 ·
…………………………………………………………Page 289……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 10…9 鼠标位于窗口外部时 MouseTest 的运行结果
系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的 Windows 系统消息进行
拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对
系统进行监测功能的软件。本程序只对鼠标消息进行拦截,相应的也可以在 Win32 环境下对
键盘、端口等应用此技术完成特定的功能。
10。7。4 键盘钩子应用实例
实例 10…4:键盘钩子应用实例。源代码在光盘中“10实例 10…4KeyBoardHook”目录下。
本节通过一个键盘钩子的实例演示线程钩子的应用 。本示例捕获用户的键盘消息并用消
息框进行显示。与上一个实例的不同之处是键盘钩子不是一个全局钩子,仅仅是一个线程钩
子,加载和卸载键盘钩子的函数如下:
BOOL __stdcall installhook()
{
//hins = AfxGetInstanceHandle();
hkb=SetWindowsHookEx(WH_KEYBOARD;(HOOKPROC)KeyboardProc;0;GetCurrentThreadId());
return TRUE;
}
BOOL __stdcall UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
键盘钩子函数定义如下:
LRESULT CALLBACK KeyboardProc(int nCode;WPARAM wParam;LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
·278 ·
…………………………………………………………Page 290……………………………………………………………
第 10 章 动态链接库
{
// ESC F1~F12
case VK_ESCAPE:msg = 〃Press Key ……ESCAPE〃;break;
case VK_F1:msg = 〃Press Key ……F1〃;break;
case VK_F2:msg = 〃Press Key ……F2〃;break;
//此处省略了部分代码,详见本书的附带光盘目录下的 hook。cpp 文件;
if(KeyNameStr==〃Num = 〃)
msg = 〃Press Key ……VK_UP〃;
if(KeyNameStr==〃Num Del〃)
msg = 〃Press Key ……VK_UP〃;
AfxMessageBox(msg);
}
LRESULT RetVal = CallNextHookEx( hkb; nCode; wParam; lParam );
return RetVal;
}
程序运行结果如图 10…10 所示。
图 10…10 键盘钩子实例运行结果
从上面的代码可以看出,在加载键盘钩子的时候传入当前的线程 ID 号,从而创建线程
钩子。此钩子函数仅仅针对当前进程有效,即在其他进程处于活动状态时钩子并不生效,这
也是线程钩子和全局钩子的重要区别。
10。8 本章小结
本章介绍了动态链接库和钩子函数的概念和编程方法 。首先讲述了动态链接库的应用背
DllMain()入口函数、Dll 导出函数的概念和显示链接和隐式链接 DLL 的方法。通过 Visual
景、
C++ 6。0 可以编写标准的 Win32 动态链接库和基于 MFC 的常规和扩展动态链接库,本章给出
了利用 AppWizard 开发各种不同动态链接库的方法。在 DLL 中嵌入 Windows 资源有着广泛
的应用,在介绍如何调用 DLL 中的对话框资源的基础上,通过界面汉化的实例介绍了 DLL
资源在软件本地化中的应用。
钩子函数也是一个重要的 Windows 编程概念,本章介绍了不同的钩子函数类型和它们的
应用方法。在全局钩子的应用中离不开动态链接库的应用,全局鼠标钩子的实例演示了加载
一个全局的钩子函数的方法。同时,在实际应用中也需要仅仅针对特定线程的钩子函数,键
盘钩子实例演示了创建一个线程钩子函数定对不同的键盘消息进行处理的过程。
·279 ·
…………………………………………………………Page 291……………………………………………………………
第 11 章 网络编程
第 11 章 网络编程
在众多的计算机技术中,网络技术恐怕是和人们关系最紧密的计算机技术了。近年来,
网络以超乎想象的速度飞速发展,已经逐渐渗透到人们的生活中。在这种趋势下,编写网络
应用程序就成为一项常见的技能。本章将系统地介绍网络编程的有关知识,主要包括以下内
容:
o 网络编程的基础知识;
o 网络应用程序的基本结构及流程;
o WinSock 类详解;
o 通过一个具体的例子详细说明网络编程的实现;
o 利用 MSm 控件进行串口编程。
11。1 网络编程的基础知识
当今主要的网络模型有 OSI 参考模型、TCP/IP 参考模型、NetBEUI 参考模型和 IPX/SPX
参考模型,其中最常用的是 TCP/IP 参考模型,本章也以 TCP/IP 参考模型来讲解网络编程技
术。
11。1。1 Socket 简介
上世纪 80 年代初,加利福尼亚大学 Berkeley 分校在 UNIX 操作系统下实现了 TCP/IP 协
议,它们为 TCP/IP 网络通信开发了一个应用程序接口(API ),这个 API 称为 socket (套接
字)接口。socket 给程序员提供了一个高层接口,它的出现使得程序员在编写网络应用程序
时只需要调用函数,对网络的底层细节并不需要精通,因此十分方便。
Socket 在 UNIX 上的巨大成功使得人们迫切想要在 Windows 上也得到同样的便利。在
Windows3。0 之后,Socket 逐渐引入到 Windows 操作系统中。Windows Socket 不仅包含了
Berkeley Socket 的库函数,并且针对 Windows 的消息驱动机制的特性,包含了一组针对
Windows 的扩展的库函数。在 Intel、Microsoft 、Sun、SGI、Informix 、Novell 等公司的大力
支持下,Windows Socket (以下简称WinSock )从 1991 年的 1。0 版发展到了 1996 年的 2。2。0
版。如今,WinSock 已经成为 Windows 网络编程的标准。
11。1。2 Windows 套接字规范简介
Windows 套接字规范从 1991 年的 1。0 版发展到 1996 年的 2。2。0 版,其中几个标志性的版
本有 WinSock1。0 、WinSock1。1 和 WinSock2。0 。
…………………………………………………………Page 292……………………………………………………………
第 11 章 网络编程
1.WinSock1。0
WinSock1。0 是网络软件供应商和用户协会细致周到的工作结晶。WinSock1。0 规范的发布
是为了让网络软件供应商和应用程序开发者都能够开始建立各自符合 WinSock 标准的实现和
应用程序。
2 .WinSock1。1
WinSock1。1 除了继承 WinSock1。0 的准则和结构外,还作了一些必要的改动。这些改动
除了包含了一些更加清晰的说明和对 WinSock1。0 的小改动之外,还包含了如下重大的变更。
o 为了更加简单的得到主机名和地址,增加了 gethostname()函数。
o 在 DLL 中保留了小于 1000 的序数,而对大于 1000 的序数则没有限制,这使 WinSock
供应商可以在 DLL 中加入自己的界面,而不用担心所选择的序数会和 WinSock 将来
的版本冲突。
o 增加了 WSAStartup() 函数和 WSACleanup() 函数之间的关联,要求两个函数对应,这使
得应用程序开发者和第三方 DLL 在使用 WinSock 实现时不需要考虑其他函数对这套
API 的调用。
o 调整函数 in_addr() 的返回类型,in_addr 的结构改为无符号长整型,这个改动是为了适
应不同的 C 编译器对返回类型为 4 字节结构函数的不同处理方法。
o 把 WSASsyncSelect() 函数语义从“边缘触发”改为“电平触发”,这种方式大大简化了
应用程序对这个函数的调用。
o 改变了 ioctlsocket()函数中 FIONBIO 的语义。如果套接字还未完成 WSASsyncSelect()
函数的调用,则该函数返回失败。
o 为了符合 RFC1122 ,在套接字选项中增加了 TCP_NODELAY 。
不过 WinSock1。1 版本只支持 TCP/IP 协议。
3 .WinSock2。0
WinSock2。0 是 WinSock1。1 发展的一个比较重大的变革。它可以支持多种协议,并且为
了能与 WinSock1。1 更好地实现其兼容性,WinSock2。0 在 WinSock1。1 基础上作了向后兼容,
即