我发现我写的都是超短的代码来着.....
闲话少说,今天说一下VC中局部钩子的实现.
先看看MSDN中对于设置钩子这个函数的说明
HHOOK SetWindowsHookEx(
  int idHook,        // type of hook to install  即钩子类型
  HOOKPROC lpfn,     // address of hook procedure  指向钩子的指针,即钩子处理过程
  HINSTANCE hMod,    // handle to application instance  包含lpfn指向dll的句柄,如钩子只与当前线程有关,则此参数设为Null
  DWORD dwThreadId   // identity of thread to install hook for  与钩子相关的线程的标识符,如果为0,则与所有线程相关
);
//此函数的返回值:如果成功,返回的是一个钩子过程句柄,如果失败的话,则是返回Null;
先建一个工程[VC6.0]下.建基于对话框的工程后.找到自动生成的主对话框的类,
为了简单,我们就把钩子设置在OnInitDialog()函数.
先找到OnInitDialog()函数.
定义几个全局变量先.
放哪里都行,为了可读性好,最好放OnInitDialog()上面
view plaincopy to clipboardprint?
HHOOK h_Mouse=NULL;  //用于保存安装的鼠标钩子的句柄  
HHOOK h_Keyboard=NULL; //用于保存安装的键盘钩子的句柄  
HWND h_Wnd=NULL;       //窗口句柄,用于接收关闭消息 
HHOOK h_Mouse=NULL;  //用于保存安装的鼠标钩子的句柄
HHOOK h_Keyboard=NULL; //用于保存安装的键盘钩子的句柄
HWND h_Wnd=NULL;       //窗口句柄,用于接收关闭消息
 
然后在OnInitiDialog()里添加如下代码:
view plaincopy to clipboardprint?
// TODO: Add extra initialization h ere  
 
//关于SetWindowsHookEx()函数的各个参数的意义,可以自己查下MSDN,在这里我简单说下本函数的意义  
//WH_MOUSE:设置鼠标钩子 WH_KEYBOARD:设置键盘钩子  
//MouseProc:实现钩子过程  
   //NULL:与当前线程相关  
//GetCurrentThreadId()取当前线程  
h_Mouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());  
h_Keyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());  
h_Wnd=m_hWnd; 
 // TODO: Add extra initialization h ere
 //关于SetWindowsHookEx()函数的各个参数的意义,可以自己查下MSDN,在这里我简单说下本函数的意义
 //WH_MOUSE:设置鼠标钩子 WH_KEYBOARD:设置键盘钩子
 //MouseProc:实现钩子过程
    //NULL:与当前线程相关
 //GetCurrentThreadId()取当前线程
 h_Mouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
 h_Keyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
 h_Wnd=m_hWnd;
再在OnInitDialog()函数上面实现键盘和鼠标钩子过程
view plaincopy to clipboardprint?
//定义鼠标钩子过程  
LRESULT CALLBACK MouseProc(  
  int nCode,      // hook code  
  WPARAM wParam,  // message identifier  
  LPARAM lParam   // mouse coordinates  
)  
{  
    //在此写处理此消息的代码  
    //返回非0值,表示我们已处理此鼠标消息了  
    return 1;  
}  
//定义键盘钩子过程  
LRESULT CALLBACK KeyboardProc(  
  int code,       // hook code  
  WPARAM wParam,  // virtual-key code  
  LPARAM lParam   // keystroke-message information  
)  
{  
    //设置一个按键来解除钩子,此处用Esc键  
    if(wParam==VK_ESCAPE)  
    {  
        //调用下一个钩子  
        //return CallNextHookEx(h_Keyboard,code,wParam,lParam);  
        //给主窗口发送一个系统消息,关闭进程  
        //全局API函数  
        ::SendMessage(h_Wnd,WM_CLOSE,0,0);  
        //解除钩子, 参数为钩子句柄   
        UnhookWindowsHookEx(h_Keyboard);  
        UnhookWindowsHookEx(h_Mouse);  
    }  
    //返回非0值,表示我们已处理此键盘消息了  
    return 1;  

//定义鼠标钩子过程
LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{
 //在此写处理此消息的代码
 //返回非0值,表示我们已处理此鼠标消息了
 return 1;
}
//定义键盘钩子过程
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
 //设置一个按键来解除钩子,此处用Esc键
 if(wParam==VK_ESCAPE)
 {
  //调用下一个钩子
  //return CallNextHookEx(h_Keyboard,code,wParam,lParam);
  //给主窗口发送一个系统消息,关闭进程
  //全局API函数
  ::SendMessage(h_Wnd,WM_CLOSE,0,0);
  //解除钩子, 参数为钩子句柄
  UnhookWindowsHookEx(h_Keyboard);
  UnhookWindowsHookEx(h_Mouse);
 }
 //返回非0值,表示我们已处理此键盘消息了
 return 1;
}
就这样我们的钩子就完成了,在代码中每行的注释都写得挺清楚了,我就不在此说明了.
这是局部钩子,大家可以学下全局的.