如何在Win32控制台窗口上设置CBT挂钩?

时间:2010-07-07 23:51:04

标签: c++ console hook

我一直在尝试使用以下代码为我的C ++控制台应用程序设置CBT挂钩:

 ...includes...

 typedef struct _HOOKDATA
 {
    int type;
    HOOKPROC hookproc;
    HHOOK hhook;
 }_HOOKDATA;

 _HOOKDATA hookdata;

 //CBT
 LRESULT CALLBACK CBTProc(int code, WPARAM wParam, LPARAM lParam)
 { 
    //do not proccess message
    if(code < 0)
    {
       cout<<"code less than 0"<<endl;
       return CallNextHookEx(hookdata.hhook,code,wParam,lParam);
    }

    switch(code)
   {
      case HCBT_ACTIVATE:
           break;
      case HCBT_CREATEWND:
           cout<<"CREATEWND"<<endl;
           break;
      case HCBT_MINMAX:
           cout<<"MINMAX"<<endl;
           break;
      default: //unknown
           cout<<"DEFAULT"<<endl;
           break;
   }

   return CallNextHookEx(hookdata.hhook, code, wParam, lParam);
}

int main()
{
   hookdata.type = WH_CBT; 
   hookdata.hookproc = CBTProc; 
   hookdata.hhook = ::SetWindowsHookEx(hookdata.type, CBTProc, 
                                    GetModuleHandle( 0 ), GetCurrentThreadId());

   if(hookdata.hhook == NULL)
   {
     cout<<"FAIL"<<endl;
     system("pause");
   }

   system("pause");
   return 0;
}

该程序似乎正在运行,因为没有编译错误或运行时错误。另外我没有在main()函数中声明'FAIL'消息,这意味着SetWindowHookEx工作正常。但是,我没有得到CBTProc函数中声明的任何消息;甚至没有'DEFAULT'消息。谁能指出代码中的逻辑错误是什么?

感谢。

1 个答案:

答案 0 :(得分:4)

问题是SetWindowHookEx基于Win32消息处理模型。控制台窗口是内核本身的子级,不创建自己的消息泵或窗口。

AFAIK无法直接做你想做的事。