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

Y_Y 3 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”消息。任何人都可以查明代码中的逻辑错误是什么?

谢谢。

Billy ONeal.. 5

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

AFAIK无法直接执行您想要的操作。