一、HOOK编程基本知识
      HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);
      参数:idHook:     指定将要安装的钩子过程的类型。
            lpfn:       指向相应的钩子过程。如果参数dwThreadId为0,
                         或者指定了一个其他进程创建的线程之标识符,
                         那么参数lpfun必须指向一个位于某动态链接库中
                         的钩子过程。否则,参数lpfn可以指向当前进程相关
                         的代码中定义的一个钩子过程。
            hMod:       指定lpfn指向的钩子过程所在的DLL的句柄。如果参数
                         dwThreadId指定的线程由当前进程创建,并且相应
                         的钩子过程定义于与当前进程相关的代码中,那么必须
                         将参数hMod设置为NULL。
            dwThread:   指定与钩子过程相关的线程标识。如果其职为0,
                         那么安装的钩子过程将与桌面上运行的所有线程都相关。
               
     1、进程内钩子
      鼠标钩子:
      LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
      {
         return 1;
      }
      HHOOK g_hMouse=NULL;
      g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
      键盘钩子:
     
      参数wParam是产生当前按键消息的键盘按键的虚拟键代码,这是Windows定义的与
      设备无关的,键盘按键的代码。当按下键盘上的按键时,它实际上发送的是一个脉
      冲信号,Windows定义了一些虚拟键代码来表示这些信号,并由键盘设备驱动程序
      负责解释。
      LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
      {
         if (VK_SPACE==wParam)                      //过滤空格键
         if(VK_F4==wParam && (1==(lParam>>29 &1))) //过滤Alt+F4组合键
            return 1;
         else
            retrun CallNextHookEx(g_hKeyBoard,code,wParam,lParam);
         if(VK_F2==wParam)
         {
            ::SendMessage(g_hWnd,WM_CLOSE,0,0);
            UnhookWindowsHookEx(g_hKeyboard);
            UnhookWindowsHookEx(g_hMouse);
         }
         return 1;
      }
      HHOOK g_hKeyboard=NULL;
      g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());         
         
     2、全局钩子
        DEF文件内容
        LIBRARY Hook
        EXPORTS
        SetHook @2                  //修改函数的默认编号
        SEGMENTS                    //DLL增加新节
        MySec READ WRITE SHARED     //设置新增节的权限
       
       
        HHOOK g_hMouse=NULL;
        HHOOK g_hKeyboard=NULL;
       
        HWND g_hWnd;                //实现不了DLL中全局变量数据共享,
                                    如果想实现DLL全局变量数据共享则如下:
        /*******************将新建立的节设为为共享**********************/
        #pragma data_seg("MySec")   //给DLL增加新的节,MySec最大长度是8个
        HWND g_hWnd=NULL;           //该变量必须初始化
        #pragma data_seg()
       
        //设置这个新增的DLL节为所有进程共享的节
        #pragma comment(linker,"/section:MySec,RWS")  
        /***************将新建立的节设为为共享结束*************/
       
       
        LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
        {
           return 1;
        }
        LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
        {
           if(VK_F2==wParam)
           {
              SendMessage(g_hWnd,WM_CLOSE,0,0);
              UnhookWindowsHookEx(g_hMouse);
              UnhookWindowsHookEx(g_hKeyboard);
           }
           return 1;
        }         
        void SetHook(HWND hwnd)
        {
          g_hWnd=hwnd;
          g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
          g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,MouseProc,GetModuleHandle("Hook"),0);
        }
       
       
       
        客户端实习
        _declspec(dllimport) void SetHook(HWND hwnd);
        SetHook(m_hWnd);