-1

これが状況です。2つの異なるウィンドウフックがあります。1つは新しいトップレベルウィンドウを監視するWH_SHELLのグローバルフックで、もう1つはWH_CALLWNDPROCのスレッドフックで、最初に検出されたトップレベルウィンドウの一部に設定されています。針。2つのフックは異なるDLLに実装されています。

私の知る限り、両方のフックが正しく取り付けられています。ただし、メッセージコード> WM_USERを使用してフックウィンドウに投稿するものは何もありません。登録メッセージはカスタムWH_CALLWNDPROCフックによって処理されますが、「通常の」ウィンドウメッセージは問題なく通過します。

検出されたウィンドウをフックするコード:

... Getting handle, mod, and procHook ...
DWORD threadId = GetWindowThreadProcessId(handle, NULL);

HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)procHook, mod, threadId);

if(!PostMessage(handle, CUSTOM_MESSAGE, NULL, NULL))
{
  ... fetch and print error message ...
}

フック自体の本体:

... Report sends a message to an agreed upon window with the passed wParam & lParam
Report(20, nCode);

if(nCode == CUSTOM_MESSAGE)
{
  ... This code is never reached ...
  Report(50, ERROR_SUCCESS);

  if(PerformTask())
    Report(200, ERROR_SUCCESS);
  else
    Report(400, ERROR_SUCCESS);
}

... More code handling more messages in the same basic form

最初のレポート呼び出しは、フックがインストールされて機能していることを確認したものです。これは、10代から20代の低いメッセージ(ERASEBACKGROUND、PAINTなど)をポストバックするためです。

CUSTOM_MESSAGEは、WM_USER + 314として定義されています。Report(...)に使用されるメッセージは、WM_USER+317です。

その後、RegisterWindowMessageを使用して送信するUINTを取得するようにコードを更新しましたが、プロセス間通信にWM_USERを使用するのは正しくありませんでした。

それで、基本的に、私のデザインまたはWindowsフックとPostMessageの使用法の何が問題になっていますか?詳細を省略した場合は、お知らせください。たくさんのコードが関係していて、これはすでにかなり大きな質問なので、私は自分が関連していると思うものだけを含めるようにしました。

余談ですが、フックをデバッグするための合意されたより良い方法はありますか?私は、合意されたウィンドウにメッセージを投稿し、そのWndProcをデバッグすることによって、cout<<...すべてと同等の道徳を使用してきました。

ありがとう、-
ケビンモントローズ

4

2 に答える 2

2

メッセージの使用に関して@Michaelは正しいですがWM_USER(アプリケーション内でのみ使用する必要があります-登録されたメッセージはここに行くのに適しています)、同時に、メッセージを受信して​​いない理由はフックの性質CallWndProcと投稿されたメッセージ。GetMessage肯定的ではありませんが、投稿されたメッセージのフックをフックしたいと思います。

別のオプションは、Debug他のすべてのフックの前にすべてのメッセージを受信するフックをフックすることです。カスタム メッセージを監視し、そこからカスタム メッセージを受信したフック (存在する場合) を特定することができます。

編集:フックをデバッグするには、問題のプロセスにアタッチし、フック プロシージャにブレークポイントを設定します。それが、私が見つけた最も簡単なデバッグ方法です。

于 2009-04-03T23:23:08.877 に答える
0

私はそれを理解したと思います。ドキュメントを完全に理解していない単純なケース。

私の CallWndProc フックは、nCode、wParam、および lParam がフックされたスレッド WndProc に渡されるものであるかのように動作しました。実際、lParam には CWPSTRUCT へのポインターが含まれていました。その構造からデータを読み取ると、すべて正常に動作します。

于 2009-04-04T03:47:06.497 に答える