女扮男装的小说

女扮男装的小说

好不容易 好不容易
回答
  • 啊的江湖骗子 啊的江湖骗子

    钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时钩子函数可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。这有点类似与mfc中的pretranslate**函数,所不同的是该函数只能用于拦截本进程中的消息,而对系统消息则无能为力。二、win32系统钩子的实现
    每种类型的钩子均由系统来维护一个钩子链,最近安装的钩子位于链的开始,拥有最高的优先级,而最先安装的钩子则处在链的末尾。要实现win32的系统钩子,首先要调用sdk中的api函数setwindowshookex来安装这个钩子函数,其原型是:
    hhook setwindowshookex(int idhook,
    hookproc lpfn,
    hinstance hmod,
    dword dwthreadid);其中,第一个参数是钩子的类型,常用的有wh_mouse、wh_keyboard、wh_get**等;第二个参数是钩子函数的地址,当钩子钩到任何消息后便调用这个函数;第三个参数是钩子函数所在模块的句柄;第四个参数是钩子相关函数的id用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息此时为全局钩子。如果指定确定的线程,即为线程专用钩子。全局钩子函数必须包含在dll(动态链接库)中,而线程专用钩子则可包含在可执行文件中。得到控制权的钩子函数在处理完消息后,可以调用另外一个sdk中的api函数callnexthookex来继续传递该消息。也可以通过直接返回true来丢弃该消息,阻止该消息的传递。使用全局钩子函数时需要以dll为载体,vc6中有三种形式的mfc dll可供选择,即regular statically linked to mfc dll(标准静态链接mfc dll)、regular using the shared mfc dll(标准动态链接mfc dll)以及extension mfc dll(扩展mfc dll)。第一种dll在编译时把使用的mfc代码链接到dll中,执行程序时不需要其他mfc动态链接类库的支持,但体积较大;第二种dll在运行时动态链接到mfc类库,因而体积较小,但却依赖于mfc动态链接类库的支持;这两种dll均可被mfc程序和win32程序使用。第三种dll的也是动态连接,但做为mfc类库的扩展,只能被mfc程序使用。三、win32 dll
    win32 dll的入口和出口函数都是dllmain这同win16 dll是有区别的。只要有进程或线程载入和卸载dll时,都会调用该函数,其原型是:
    bool winapi dllmain(hinstance hinstdll,dword fdwreason,lpvoid lpvreserved);其中,第一个参数表示dll的实例句柄;第三个参数系统保留;第二个参数指明了当前调用该动态连接库的状态,它有四个可能的值:dll_process_attach(进程载入)、dll_thread_attach(线程载入)、dll_thread_detach(线程卸载)、dll_process_detach(进程卸载)。在dllmain函数中可以通过对传递进来的这个参数的值进行判别,根据不同的参数值对dll进行必要的初始化或清理工作。由于在win32环境下,所有进程的空间都是相互独立的,这减少了应用程序间的相互影响,但大大增加了编程的难度。当进程在动态加载dll时,系统自动把dll地址映射到该进程的私有空间,而且也复制该dll的全局数据的一份拷贝到该进程空间,每个进程所拥有的相同的dll的全局数据其值却并不一定是相同的。当dll内存被映射到进程空间中,每个进程都有自己的全局内存拷贝,加载dll的每一个新的进程都重新初始化这一内存区域,也就是说进程不能再共享dll。因此,在win32环境下要想在多个进程**享数据,就必须进行必要的设置。一种方法便是把这些需要共享的数据单独分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,建立一个内存共享的dll。四、全局共享数据的实现
    可以用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:
    pragma data_seg("shareddata")
    hwnd sharedwnd=**;共享数据
    pragma data_seg()
    所有在data_seg pragmas语句之间声明的变量都将在shareddata段中。仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其效果是相同的),一种方法是在.def文件中加入如下语句:
    setctions
    shareddata read write shared
    另一种方法是在项目设置链接选项中加入如下语句:
    section:shareddata,rws
    五、鼠标钩子程序示例
    本示例程序用到全局钩子函数,程序分两部分:可执行程序mousedemo和动态连接库mousehook。首先编制mfc扩展动态连接库mousehook.dll:
    (一)选择mfc appwizard(dll)创建项目mousehook;(二)选择mfc extension dll(mfc扩展dll)类型;(三)通过project菜单的addtoproject子菜单的"new…"添加头文件mousehook.h。(四)在头文件中建立钩子类:
    class afx_ext_class cmousehook:public cobject
    {
    public:
    cmousehook();钩子类的构造函数
    cmousehook();钩子类的析构函数
    bool starthook(hwnd hwnd);安装钩子函数
    bool stophook();卸载钩子函数
    };(五)在mousehook.cpp文件中加入#include"mousehook.h"语句;(六)加入全局共享数据变量:
    pragma data_seg("mydata")
    hwnd glhprevtarwnd=**;上次鼠标所指的窗口句柄
    hwnd glhd**playwnd=**;显示目标窗口标题编辑框的句柄
    hhook glhhook=**;安装的鼠标勾子句柄
    hinstance glhinstance=**;dll实例句柄
    pragma data_seg()
    (七)在def文件中定义段属性:
    sections
    mydata read write shared
    (八)在主文件mousehook.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)
    {
    afxtermextensionmodule(mousehookdll);}
    return 1;ok
    }
    这个函数最重要的部分是调用afxinitextensionmodule(),它初始化dll使它在mfc框架中正确的工作。它需要传递给dllmain()的dll实例句柄和afx_extension_module结构,结构中存在着对mfc有用的信息。(九)类cmousehook的成员函数的具体实现:
    cmousehook:cmousehook()/类构造函数
    {
    }
    cmousehook:~cmousehook()/类析构函数
    {
    stophook();}
    bool cmousehook:starthook(hwnd hwnd)/安装钩子并设定接收显示窗口句柄
    {
    bool bresult=false;glhhook=setwindowshookex(wh_mouse,mouseproc,glhinstance,0);if(glhhook!**)
    bresult=true;glhd**playwnd=hwnd;设置显示目标窗口标题编辑框的句柄
    return bresult;}
    bool cmousehook:stophook()/卸载钩子
    {
    bool bresult=false;if(glhhook)
    {
    bresult=unhookwindowshookex(glhhook);if(bresult)
    {
    glhprevtarwnd=**;glhd**playwnd=**;清变量
    glhhook=**;}
    }
    return bresult;}
    (十)钩子函数的实现
    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!**)
    {
    glhtargetwnd=parentwnd;parentwnd=getparent(glhtargetwnd);取应用程序主窗口句柄
    }
    if(glhtargetwnd!glhprevtarwnd)
    {
    char szcaption[100];getwindowtext(glhtargetwnd,szcaption,100);取目标窗口标题
    if(**window(glhd**playwnd))
    send**(glhd**playwnd,wm_settext,0,(lparam)(lpctstr)szcaption);glhprevtarwnd=glhtargetwnd;保存目标窗口
    }
    }
    return callnexthookex(glhhook,ncode,wparam,lparam);继续传递消息
    }
    编译完成便可得到运行时所需的鼠标钩子的动态连接库mousehook.dll和链接时用到的mousehook.lib。六、集成
    下面新建一调用鼠标钩子动态连接库的钩子可执行程序:
    (一)用mfc的appwizard(exe)创建项目mousedemo;(二)选择"基于对话应用",其余几步均为确省;(三)在对话框上加入一个编辑框idc_edit1;(四)在mousedemo.h中加入对mousehook.h的包含语句:#include"mousehook.h;(五)在cmousedemodlg.h的cmousedemodlg类定义中添加私有数据成员:cmousehook m_hook;(六)在oninitdialog函数的"todo注释"后添加:
    cwnd*pwnd=getdlgitem(idc_edit1);取得编辑框的类指针
    m_hook.starthook(pwnd->getsafehwnd());取得编辑框的窗口句柄并安装钩子
    (七)链接dll库,即把mousehook.lib加入到项目设置链接标签中;(八)把mousehook.h和mousehook.lib复制到mousedemo工程目录中,mousehook.dll复制到debug目录下。编译执行程序即可。当鼠标滑过窗口时便会在编辑框中将此窗口的标题显示出来。结论:
    系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的windows
    系统消息进行拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要
    有监控、自动记录等对系统进行监测功能的软件。本程序只对鼠标消息进行拦截,
    相应的也可以在win32环境下对键盘、端口等应用此技术完成特定的功能。

类似问答
精品推荐

友情链接

友链互换QQ:

谷财 备案编号:蜀ICP备11019336号-3商务合作:235-677-2621

Copyright 2009-2020 Chengdu Sanzilewan Technology Co.,Ltd all rights reserve

抵制不良游戏 拒绝盗版游戏 注意自我保护 谨防受骗上当 适度游戏益脑 沉迷游戏伤身 合理安排时间 享受健康生活