友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

VC语言6.0程序设计从入门到精通-第78章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






 ·274 ·  


…………………………………………………………Page 286……………………………………………………………

                                                                                        第 10 章    动态链接库  



data_seg 建立一个新的数据段并定义共享数据,其具体格式为:  



     pragma data_seg (〃shareddata〃)  



      HWND sharedwnd=NULL;//共享数据      



      #pragma data_seg()  



      所有在 data_seg pragmas 语句之间声明的变量都将在 shareddata 段中。仅定义一个数据段 

还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其 

效果是相同的),一种方法是在 DEF 文件中加入如下语句:  



      SETCTIONS  



      shareddata READ WRITE SHARED  



      另一种方法是在项目设置链接选项中加入如下语句:  



     /SECTION:shareddata;rws  



      MouseHookDll 是一个 MFC 扩展动态链接库,其中包含的安装钩子和卸载钩子的全局函 

数如下:  



      BOOL __stdcall StartHook(HWND hwnd);  



       



      BOOL __stdcall StopHook();  



      全局共享数据声明如下:  



      #pragma data_seg(〃mydata〃)      



      HWND glhPrevTarWnd=NULL;               //上次鼠标所指的窗口句柄      



      HWND glhDisplayWnd=NULL;               //显示目标窗口标题编辑框的句柄      



      HHOOK glhHook=NULL;                    //安装的鼠标勾子句柄      



      HINSTANCE glhInstance=NULL;            //DLL 实例句柄      



      #pragma data_seg()  



      在 DEF 文件中加入如下定义:  



      SECTIONS  



     mydata READ WRITE SHARED  



      在主文件 MouseHookDll。cpp 的 DllMain() 函数中加入保存 DLL 实例句柄的语句如下:  



      extern 〃C〃 int APIENTRY      



      DllMain(HINSTANCE hInstance; DWORD dwReason; LPVOID lpReserved)    



      {    



           UNREFERENCED_PARAMETER(lpReserved);    



           if (dwReason == DLL_PROCESS_ATTACH)    



           {    



                 if (!AfxInitExtensionModule(MouseHookDLL; hInstance))    



                      return 0;    



                 new CDynLinkLibrary(MouseHookDLL);    



                 glhInstance=hInstance;        //插入保存 DLL 实例句柄    



           }    



           else if (dwReason == DLL_PROCESS_DETACH)    



           {    



                                                                                                       ·275 ·  


…………………………………………………………Page 287……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



                    AfxTermExtensionModule(MouseHookDLL);    



             }    



             return 1; // ok    



       }  



       这个函数最重要的部分是调用 AfxInitExtensionModule() ,它初始化 DLL 并在 MFC 框架 

中正确地工作。它需要传递给 DllMain() 的 DLL 实例句柄和 AFX_EXTENSION_MODULE 结 

构,结构中存在着对 MFC 有用的信息。  

       加载和卸载鼠标全局钩子的函数接口定义如下:  



       BOOL __stdcall StartHook(HWND hWnd)  



       {                   //install hoook  



             hMouseHook=SetWindowsHookEx(WH_MOUSE;MouseHookProc;glhInstance;0);  



                          //mouse hook  



             if(hMouseHook)  



             {  



                    glhDisplayWnd=hWnd;             //设置显示目标窗口标题编辑框的句柄    



                    return TRUE;  



             }  



             return FALSE;  



       }  



        



       BOOL __stdcall StopHook()  



       {                   //unstall hook  



             BOOL mHook=UnhookWindowsHookEx(hMouseHook);  



             if(mHook)  



                    return TRUE;  



             return FALSE;  



       }  



       钩子函数的具体实现代码如下:  



       LRESULT WINAPI MouseProc(int nCode;WPARAM wparam;LPARAM lparam)      



       {  



             LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;      



             if (nCode》=0)      



             {      



                    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))  



         
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!