2010-12-08 5 views
3

私はWH_CBTフックを設定しようとしており、常に0を返します。 私はエラーをチェックし、エラー1428が発生しました。ちょっと調べてnullの代わりに何を入れるべきか分かりませんが、hModパラメータに問題があることが分かりました。誰かが私が間違っていることを知っていますか?なぜSetWindowsHookExは0を返しますか?

これは私のコードです:

#include "stdafx.h" 
#include "Windows.h" 
#include <iostream> 
using namespace std; 

HHOOK hookHandle; 

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
hookHandle = SetWindowsHookEx(WH_CBT,CBTProc,NULL,0); 

if(hookHandle == NULL) 
{ 
    cout << "ERROR CREATING HOOK: "; 
    cout << GetLastError() << endl; 
    getchar(); 
    return 0; 
} 

MSG message; 

while(GetMessage(&message, NULL, 0, 0) != 0) 
{ 
    TranslateMessage(&message); 
    DispatchMessage(&message); 
} 



cout << "Press any key to quit..."; 
getchar(); 

UnhookWindowsHookEx(hookHandle); 

return 0; 
} 

LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam, LPARAM lParam) 
{ 
cout << "hello" << endl; 
    return CallNextHookEx(hookHandle, nCode, 
      wParam, lParam); 
} 

P.S.コードに愚かな要素がある場合、私はお詫び申し上げます。私はプログラミングの初心者ではなく、C++だけです。

答えて

1

GetModuleHandle(NULL)GetCurrentThreadId()を使用して、その関数に渡す必要があるハンドルとスレッドIDを取得します。

サンプル:

hookHandle = SetWindowsHookEx(WH_CBT,CBTProc, 
           GetModuleHandle(NULL), 
           GetCurrentThreadId()); 

ローガンが言うように、唯一の現在のプロセスをフックします。システムフックを開発するには、コードをdllに入れる必要があります。

+0

どのようにですか?あなたは私に例を挙げてくれますか? – Oran

+0

私の答えにサンプルを追加 –

+0

私は同じエラーを受け取ります... – Oran

3

グローバルにするフックを指定するthreadidに0を指定した場合。そのためには、フックを他のプロセスに注入する必要があります。つまり、フックをDLLから公開する必要があります。フックプロシージャをdllに移動するか、プロセス内にスレッドを指定する必要があります。

+0

ちょっと質問がありますが、.dll内のフックのインストールは可能ですか(フックprocはどこにありますか)? –

関連する問題