2010-07-07 47 views
2

我一直在試圖建立一個CBT鉤子我用下面的代碼C++控制檯應用程序:如何在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; 
} 

程序似乎是工作,因爲沒有編譯錯誤,也沒有運行時錯誤。此外,我沒有在main()函數中聲明的'FAIL'消息,這意味着SetWindowHookEx工作正常。但是,我沒有收到CBTProc函數中的任何消息。甚至沒有'DEFAULT'消息。任何人都可以指出代碼中的邏輯錯誤是什麼?

謝謝。

回答

4

問題是SetWindowHookEx基於Win32消息處理模型。控制檯窗口是內核本身的子項,不會創建自己的消息泵或窗口。

AFAIK直接做你想做的事情是不可能的。

相關問題