2010-07-07 4 views
2

는 다음 코드 내 C++ 콘솔 응용 프로그램에 대한 CBT 후크를 설정하는 노력했습니다 : 오류도 런타임 오류를 컴파일하지 있기 때문에Win32 콘솔 창에서 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; 
} 

이 프로그램은 작동하는 것 같군. 또한 SetWindowHookEx가 작동하고 있다는 것을 의미하는 main() 함수에 'FAIL'메시지가 표시되지 않습니다. 그러나 CBTProc 함수에 명시된 메시지는 표시되지 않습니다. 'DEFAULT'메시지조차도 아닙니다. 누구든지 코드에서 논리 오류가 무엇인지 지적 할 수 있습니까?

감사합니다.

답변

4

문제는 SetWindowHookEx는 Win32 메시지 처리 모델을 기반으로한다는 것입니다. 콘솔 창은 커널 자체의 자식이며 자체 메시지 펌프 또는 창을 만들지 않습니다.

AFAIK는 직접하고 싶은 것을하는 것은 불가능합니다.

관련 문제