2016-10-04 3 views
0

複数のスレッドが実行されているguiにはサードパーティのプロセスがあります。このプロセスをGUIのスレッドに設定する必要があります。インターフェイスウィンドウのIDスレッドを知る方法は?

processID = 8888; //pid 
HWND hWnd = GetForegroundWindow(); 
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), threadID); 

processId挿入を手動でタスクマネージャから(デバッグのために、その後、彼はスクリプトに戻ります):次のように私はやります。最後の行のthreadIDオプションを0に置き換えると、フックは機能しますが、ブラウザ内であってもどこでも動作します。私は間違って何をしていますか?

+0

あなたの質問は何ですか私は答えを見つけましたか?あなたが尋ねる唯一の本当の疑問は、「なぜこのAPIは[文書化された(https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990.aspx)として動作しますか?」* – IInspectable

答えて

0

MSDNによれば、WH_KEYBOARD_LLで一つのスレッドだけをターゲットにすることはできません:。

「フックの範囲は、フックタイプによって異なりますいくつかのフックが唯一のグローバルスコープで を設定することができ、他の人がすることができます次の表に示すように、特定の スレッドのみに設定することもできます。

...

WH_KEYBOARD_LLグローバルのみ

...

注:また、一方が第3のパラメータとのGetModuleHandle(NULL)から到着現在.EXE proceessインスタンスを渡すことはできませんSetWindowsHookEx(ここではDLLハンドルまたはNULLが必要です)。

+1

DLLをコンパイルまたは使用する必要のない低レベルのキーボードフックです。これはドキュメントで指摘されています:* "このフックは、それをインストールしたスレッドのコンテキストで呼び出されます。フックをインストールしたスレッドにメッセージを送信することによって呼び出しが行われます。メッセージループ "* – IInspectable

+0

したがって、サードパーティのプロセスから到着した傍受されたものだけを受け入れる方法は? –

+1

低レベルのマウス・フックを使用することはできません。そのフックは**受信者が決定される前**と呼ばれます(これは特定のスレッド用にインストールできない理由です)。 – IInspectable

-2

私の仕事では、set hookとKeyboardProcが単一の領域(.cppファイル)にあるようにする必要がありました。

1)グローバルvarible processID

2製)セットフックメソッド

processID = GetCurrentProcessId(); 
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, NULL, 0); 

3)ではKeyboardProc方法は:

DWORD actProcess; 
HWND hwnd = GetForegroundWindow(); 
GetWindowThreadProcessId(hwnd, &actProcess); 
if (nCode == HC_ACTION) 
{ 
    if (processID == actProcess) 
    { 
    //do something 
    } 
} 
+0

少なくともマイナス何に書かれている? –

+0

**低レベルの**キーボードフックを特定のスレッドに使用することはできません。あなたの目的は答えです。それはおそらくこの思考プロセスの結果です。*「ああ、低レベル**!それは私です」*とにかく、それは問題に対処しておらず、あなたの質問はおそらくあなたの**本当の**問題についても聞いていません。 – IInspectable

関連する問題