Как я могу установить хук CBT в окне консоли Win32? - PullRequest
3 голосов
/ 08 июля 2010

Я пытался настроить ловушку CBT для моего консольного приложения C ++ с помощью следующего кода:

 ...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;
}

Программа, кажется, работает, потому что нет ни ошибок компиляции, ни ошибок времени выполнения.Также я не получаю сообщение «FAIL», указанное в функции main (), означающее, что SetWindowHookEx работает нормально.Однако я не получаю никаких сообщений, указанных в функции CBTProc;даже не сообщение «ПО УМОЛЧАНИЮ».Может кто-нибудь точно определить, в чем логическая ошибка в коде?

Спасибо.

1 Ответ

5 голосов
/ 08 июля 2010

Проблема в том, что SetWindowHookEx основан на модели обработки сообщений Win32. Окна консоли являются потомками самого Ядра и не создают свои собственные сообщения или окна сообщений.

AFAIK делать то, что вы хотите напрямую, невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...