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

3
我一直在尝试使用以下代码为我的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()函数中说明SetWindowHookEx工作正常的“FAIL”消息。然而,我没有收到CBTProc函数中任何消息,甚至没有“DEFAULT”消息。有人可以指出代码中的逻辑错误吗?
谢谢。
1个回答

5
问题在于SetWindowHookEx基于Win32消息处理模型。控制台窗口是内核的子级,不会创建自己的消息泵或窗口。
据我所知,直接做你想要的事情是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接