我在一个对话框类中定义了一个变量m_hook;
并且在该对话框的OnInitDialog中
m_hook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());进行赋值。
钩子函数:
LRESULT CALLBACK CHookDlg::KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{

if(VK_SPACE == wParam)
return CallNextHookEx(m_hHook1,code,wParam,lParam);
else
return 1;
}
我将KeyboardProc声明为类的static成员函数。编译后会报错:
G:\VCproject\Hook\HookDlg.cpp(193) : error C2597: illegal reference to data member 'HookDlg::m_hHook1' in a static member function
这是什么原因?改成全局变量可以通过。

解决方案 »

  1.   

    static成员函数只能访问static的成员变量,你的hookDlg::m_hHook1也得声明为静态的。
      

  2.   

    这个参数现在可以忽略。微软在这里设计就有问题,本来KeyboardProc就是回调函数(设计合理的话,应该参数个数和CallNextHookEx一致才对,但偏偏就少一个参数),SetWindowsHookEx不把返回值传进去,而CallNextHookEx多一个参数出来,非要逼我们使用全局变量,这不是搞笑么?现在MS已经修正了,所以可以忽略这个参数了。
      

  3.   

    楼主说了具体的原因象下面这样实现即可
    CallNextHookEx(m_hHook1,code,wParam,lParam);
    ----------->
    CallNextHookEx(NULL,code,wParam,lParam);