問題タブ [setwindowshookex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - SetWindowsHookExWH_KEYBOARD_LLがイベントを取得していません
SetWindowsHookEx()を使用してキーボードフックを作成しています。作成は成功したようですが、登録されているプロシージャが呼び出されることはありません。私が間違っていることはありますか?
=
=
=
c++ - プロセス内のすべてのスレッドにフックをインストールできません
アプリケーションでキーボードをフックしています。要件は、プロセス内のすべてのスレッドでキーボードをフックすることです。
SetWindowsHookExAPIを使用しました
フックは、処理中のすべてのスレッドに対して作成されます。これは、呼び出しスレッドが存在するまで正常に機能します。呼び出しスレッドが終了するとすぐに、フックは機能を停止します。
プロセス内のスレッドではなく、プロセスにフックする方法はありますか?
c# - C# で WindowsHookEx を設定する
画面に描画できるように、サードパーティのアプリをフックしようとしています。画面への描画は簡単で、助けは必要ありませんが、 を使用SetWindowsHookEx
して処理するのに問題があるようですWH_GETMESSAGE
。最後の 2 つのパラメーターに何を渡せばよいかわかりません。
c++ - C++ SetWindowsHookEx WH_KEYBOARD_LL 正しいセットアップ
キーの押下 (上矢印など) を記録したいコンソール アプリケーションを作成しています。任意のスレッドですべてのキー押下をキャプチャし、コールバック関数を呼び出すことになっている低レベルのキーボード フックを作成しましたが、機能しません。キーを押すとプログラムが少し停止しますが、コールバックは呼び出されません。ドキュメントを確認しましたが、何も見つかりませんでした。SetWindowsHookEx() を間違って使用しているのか (私の知る限り、フックが正常に作成されているのか)、それともコールバック関数が正しくないのかわかりません! 何が悪いのかわからない!助けてくれてありがとう。
.net - VS2008 デバッガー内で SetWindowsHookEx を呼び出すと、常に NULL が返される
低レベルのキーボード フックを行う .Net アプリケーションに取り組んでいます。デバッガー内で実行されている SetWindowsHookEx を呼び出すと、呼び出しは常に失敗します。
コンパイルされた実行可能ファイルから実行すると、すべて正常に動作します。プロセスにアタッチすると、SetWindowsHookEx が呼び出され、すべてが機能します。
私はVSがすでに低レベルのキーボードフックを行っていることをどこかで読んだことがあります(思い出せません)が、CallNextHook関数があるため、これは問題になりません。
誰かが何が起こっているか知っていますか?
編集:コードはかなり厳格です。例外はデバッガーの内部でスローされますが、外部ではスローされません。
c# - Windows が低レベル (グローバル) キーボード フックをアンフックする原因は何ですか?
SetWindowsHookEx
withを介してインストールされたいくつかのグローバル キーボード フックWH_KEYBOARD_LL
があり、Windows によってランダムにフック解除されるようです。
UnhookWindowsHookEx
ハンドルを呼び出すと が返されるため、フックがアタッチされなくなったことを確認しましたfalse
。true
(正常に動いていた時に戻ることも確認済み)
一貫した再現性はないようです。タイムアウトや例外がスローされたためにフックが外れる可能性があると聞きましたが、処理メソッドのブレークポイントに1分以上置くだけで両方を試しました.ランダムな例外 (C#) をスローするだけでなく、それでも動作しているように見えます。
コールバックでは、すぐに別のスレッドに投稿するので、おそらく問題にはなりません。Windows 7は明らかにタイムアウトについてより積極的であるため、レジストリでタイムアウトをより高く設定するためのWindows 7のソリューションについて読みました(ここではすべてWin7を実行しているため、これが他のOSで発生するかどうかはわかりません)が、そうではありません理想的な解決策とは思えません。
バックグラウンド スレッドを実行してフックを時々更新することを検討しましたが、これはハックですが、それを行うことによる実際の悪影響については知りません。Windows のグローバル レジストリ設定を変更するよりも優れているようです。 .
他の提案や解決策はありますか? フックを設定するクラスとそれらがアタッチされているデリゲートはどちらも静的であるため、GC を取得するべきではありません。
編集:GC.Collect();
それらがまだ機能していることを呼び出して検証したため、ガベージ収集されていません。
c# - モジュールが見つかりません
私はこれにかなり取り組んできましたが、解決策に近づくことはできませんでした。
私はWindowsHookLibの古いコピーをもう一度掘り起こしました-それはhttp://www.codeproject.com/KB/DLL/WindowsHookLib.aspxのソースで入手できます。このライブラリを使用すると、グローバルWindowsマウス/キーボード/クリップボードフックを使用できます。これは非常に便利です。
ここでマウスフックを使用してマウスモーションをキャプチャしようとしています(常にCursor.Positionをポーリングするタイマーを使用できますが、後でWindowsHookLibのより多くの機能を使用する予定です)。
次のようにコーディングします。
しかし、InstallHook()を呼び出すと、「指定されたモジュールが見つかりませんでした」という例外が発生します。変。検索したところ、DLLがWindows PATH変数に含まれている場所にないため、誰かがこれが発生すると考えていたことがわかりました。また、DLLをsystem32に配置しても問題が解決しなかったため、すべてをC#に変換して直接含めることができました。プロジェクト(私はそれがどのように機能するのか興味がありました)。
しかし、エラーは執拗に持続していたので、私はこれについて少し掘り下げて、責任のあるライブラリ内のコードを見つけました:InstallHook()で、
そして、これ(変更と再コンパイル後)は、私が実際に取得しているのはWindowsエラー「ERROR_MOD_NOT_FOUND」であることを示しています。さて、ここで私は困惑しています。フックライブラリをプロジェクトに直接コンパイルしただけではありませんか?
(UnsafeMethods.SetWindowsHookExは、user32からのDllImportedメソッドにすぎません)
回答、正しい方向の製品、またはヒント、ポインタなどは非常に高く評価されています。
c++ - コードの実行が完了するまで、イベントがGUIに配信されないようにするにはどうすればよいですか?
次のようなグローバルマウスフック関数をインストールしました。
フック関数は次のようになります。
さて、私の問題は、「面白いことをする」部分にかかる時間を正確に制御できないことです。特に、Windowsレジストリで定義されているLowLevelHooksTimeoutよりも時間がかかる場合があります。これは、少なくともWindows XPでは、システムがマウスイベントをフック機能に配信しなくなったことを意味します。これを避けたいのですが、同時に、ターゲットGUIがイベントを受信する前に、「面白いことをする」部分を実行する必要があります。
mouseEventHookFn
上記がワーカースレッドにメッセージを投稿してすぐに実行できるように、別のスレッドで「興味深いもの」の作業を行うことでこれを解決しようとしましたreturn 1;
(これによりフック機能は終了しますが、イベントがGUIに渡されることはありません) )。アイデアは、ワーカースレッドが終了すると、CallNextHookEx
呼び出し自体を実行するというものでした。
ただし、これにより内部でCallNextHookEx
クラッシュが発生します(実際、クラッシュはという内部関数の内部で発生します。フック関数の外部PhkNextValid
から呼び出すのは安全ではないと思いますが、これは本当ですか?CallNextHookEx
もしそうなら、GUIがイベントを受信する前にコード(アプリケーションのGUIスレッドと対話する必要がある)を実行し、フック関数が長時間ブロックされないようにする方法を他の誰かが知っていますか?
windows - SetWindowsHookEx を使用したプロセス全体のフック
1 つまたは複数の外部プロセスに dll を挿入する必要があります。そこから、keybord イベントも傍受したいと考えています。そのため、WH_KEYBOARD で SetWindowsHookEx を使用すると、1 つのステップで両方を実現する簡単な方法のように見えます。
いくつかの選択されたプロセスにのみ関心がある場合、グローバルフックをインストールしたくありませんが、Windows フックはグローバルまたはスレッドのみのようです。
私の質問は、プロセス全体のフックを適切に設定する方法です。
1つの方法は、アプリケーションからターゲットプロセスのメインスレッドにフックを設定し、DLL_PROCESS_ATTACHで他のすべての実行中のスレッドに対してDLL_PROCESS_ATTACHで同じことを行うことです(さらに後で開始されたスレッドのDLL_THREAD_ATTACHで)。しかし、これは本当に良い方法ですか?さらに重要なことは、プロセス全体のフックをセットアップする簡単な方法はありませんか? 私のアイデアはかなり面倒で醜いように見えますが、これを行うことに関する情報はどこにも見つかりませんでした。
multithreading - スレッド コンテキストで SetWindowsHookEx 呼び出し関数を作成する
GUI アプリケーションで使用するSetWindowsHookEx
には、通常、最終行に、イベントが発生するたびに呼び出されるスレッド内の関数が必要です。
たとえば、システムで押されているすべてのキーを表示するソフトウェアを作成している場合、キーが押さAddKeyToList(int vkeycode)
れるたびに GUI アプリに関数が呼び出されるようにしたいと考えています。
私は Windows の内部の専門家ではありませんが、ドキュメントを正しく理解していれば、によってインストールされたフックは、フックしSetWindowsHookEx
ているイベントを引き起こしたスレッドのコンテキストで呼び出されています。したがって、私が説明したことを行うには、次のことを行う必要があります。
フック関数を含む DLL を作成し、そこにすべてのスレッドが共有して相互に通信する共有メモリ領域を作成します。
pInvoke
フック関数と GUI プログラムの両方で like メカニズムを作成します。この例では、フック関数は押されたキーを GUI プログラムに送信し、GUI プログラムは独自のコンテキストでAddKeyToList
関数を呼び出します。
これは、比較的単純なクラスでは信じられないほど複雑であり (UNIX の世界の XRecord 拡張機能と比較して) Qt
、.
これらのメカニズムを既に実装しているライブラリ (できればオープン ソース) はありますかWH_KEYBOARD_LL
?
私の分析は正しいですか、それとも私が説明したことを達成するためのより簡単な方法はありますか?
Qt
図書館はこの仕事を手伝ってくれますか?