兜兜10

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、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()
          
          #pragma comment(linker,"/section:MySec,RWS")   //设置这个新增的DLL节为所有进程共享的节
          /*******************************将新建立的节设为为共享结束*******************************/
         
         
          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);

posted on 2010-12-09 15:09  兜兜10  阅读(88)  评论(0)    收藏  举报