3

ヘリ、

WinXP では、私のアプリケーションはグローバル マウスフックを使用して、フォーカスがない場合でもマウスの位置とクリックを正常に取得しています。フックは別の .dll にあり、次のように初期化されています (デルファイで):

SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0);

現在Win7では、これは基本的に実行時にも機能しますが、アプリケーションをうまくデバッグできなくなりました(XPでは可能です)。ブレークポイントに到達するとすぐに、Win7 が完全にフリーズします。別のプロセスに切り替えることができません(タスクマネージャーでも開けません)。運が良ければ、IDE でプロセスを停止できます。ほとんどの場合、アクセスを回復するには再起動/ログオフする必要があります。

フックを使用しないと存在しないため、問題がマウスフックに関連していることはわかっています。これは、私の hookprocedure が次のことだけを行っている場合でも同様です:

CallNextHookEx(MouseHook, Code, wParam, lParam);

すなわち。単にフックの存在が問題を引き起こします。

globalhooks.dll で EventLog に何かを書き込むと、ブレークポイントにいるときでもまだアクティブであることがわかります。

WH_MOUSE_LL を介して lowlevelmouse フックを使用しようとしましたが、これは基本的に機能しますが、フックのインストール中やウィンドウのサイズ変更中に奇妙なマウス移動の遅延が発生します。また、ブレークポイントに到達すると数秒間フリーズしますが、少なくともシステムは約 5 秒後に回復します... したがって、このオプションは実行時間にも影響するため、さらに悪化します。

そもそもデバッグ中に WH_MOUSE フックがアプリをフリーズさせる理由はありますか?

4

1 に答える 1

1

アプリをデバッグしている場合は、HInstance を使用しないでください。.exe 自体をグローバル プロセスに挿入しています。デバッグ時に、問題を説明できるすべてのマウス処理を停止しています。

SetWindowsHookEx のドキュメントには、独自のプロセスにフックする場合は 0 を渡し、リモートまたはグローバル プロセスにフックする場合は DLL にハンドルするように記載されています。

また、MouseHookCB() が CallNextHookEx の値を返していることを確認してください。

于 2011-01-19T00:07:14.183 に答える