2010-07-07 4 views
2

J'ai essayé de mettre en place un crochet CBT pour mon application console C++ avec le code suivant:Comment puis-je configurer un hook CBT sur une fenêtre de la console Win32?

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

Le programme semble fonctionner parce qu'il n'y a pas d'erreurs de compilation ni erreurs d'exécution. De plus, je ne reçois pas de message 'FAIL' dans la fonction main(), ce qui signifie que SetWindowHookEx fonctionne correctement. Cependant, je ne reçois aucun des messages indiqués dans la fonction CBTProc; pas même le message 'DEFAUT'. Quelqu'un peut-il préciser quelle est l'erreur de logique dans le code?

Merci.

Répondre

4

Le problème est que SetWindowHookEx est basé sur le modèle de gestion de messages Win32. Les fenêtres de console sont des enfants du noyau lui-même et ne créent pas leurs propres pompes ou fenêtres de message. AFAIK faire ce que vous voulez directement n'est pas possible.

Questions connexes