問題タブ [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.
delphi - Windows グローバル キーボード フック - Delphi
インターネットで見つけたソース コードを使用して、グローバル キーボード フック DLL を作成しました。最良の部分は、ブラウザを除いて、見事に機能します。
ブラウザがフォーカスを取得すると、押された最初のキーが失われるように見えることを除いて、ブラウザのすべてのキーを取得します。これを IE と Firefox でテストしたところ、どちらも同じようです。
たとえば、IE を開いて www と入力すると、、帰るしかないww。ブラウザ ウィンドウがフォーカスされたままであれば、それ以上キーが失われることはありません。ブラウザーがフォーカスを失い、フォーカスを取り戻すとすぐに、最初のキーが再び失われます。
WH_KEYPRESS / WH_KEYUP の代わりに WH_KEYDOWN のみを使用しているためでしょうか? 誰でもこれに光を当てることができますか?
ありがとうございました
PS: フック関数自体は以下のとおりです: DLL にはメモ ボックスとアプリ ハンドルが送信され、DLL はメッセージとユーザー メッセージを送信します。
winapi - グローバル CBT フックをアンフックした後、すべてのプロセスから DLL をアンロードする
DLL をロードしたシステム全体のフックがアンロードされたときに、すべてのプロセスから DLL を適切にアンロードするにはどうすればよいですか?
MSDNから:
UnhookWindowsHookEx を使用してグローバル フック プロシージャを解放できますが、この関数はフック プロシージャを含む DLL を解放しません。これは、デスクトップ内のすべてのアプリケーションのプロセス コンテキストでグローバル フック プロシージャが呼び出され、それらのすべてのプロセスに対して LoadLibrary 関数が暗黙的に呼び出されるためです。別のプロセスに対して FreeLibrary 関数を呼び出すことはできないため、DLL を解放する方法はありません。DLL に明示的にリンクされたすべてのプロセスが終了するか、FreeLibrary を呼び出し、フック プロシージャを呼び出したすべてのプロセスが DLL の外部で処理を再開した後、システムは最終的に DLL を解放します。
だから私が探しているのは、フックがフックされていないことを検出し、フックFreeLibrary
されたすべてのプロセスから呼び出す方法です。フックがアンロードされたときに DLL を即座にアンロードする他の方法はありますか?
windows - VistaでSetWindowsHookExを使用し、UACで管理アプリをフックする方法は?
SetWindowsHookExを使用して、UACを有効にしてVistaで管理者権限で実行されているアプリに影響を与える方法があるかどうかを調べようとしています。これは、マルチモニター対応の処理を有効にするために、他のウィンドウのキャプションバーに小さなボタンを追加する必要があるアプリです。これはできないと思っていたのですが、これを実行しているように見えるアプリを1つ見ました。私の知る限り、この他のアプリは管理者権限で実行されていませんが、管理者権限を持つアプリを含め、システム内のすべてのアプリに影響を与える可能性があります。
それなら、これを行う方法があるように思われるかもしれませんが、私はその方法に戸惑っています。私のアプリは、ウィンドウのタイトルバーに描画でき、その動きとサイズに影響を与えることができれば十分です。私は他に何もする必要はありません。
delphi - Win7 のブレークポイントで SetWindowsHookEx WH_MOUSE がフリーズする
ヘリ、
WinXP では、私のアプリケーションはグローバル マウスフックを使用して、フォーカスがない場合でもマウスの位置とクリックを正常に取得しています。フックは別の .dll にあり、次のように初期化されています (デルファイで):
現在Win7では、これは基本的に実行時にも機能しますが、アプリケーションをうまくデバッグできなくなりました(XPでは可能です)。ブレークポイントに到達するとすぐに、Win7 が完全にフリーズします。別のプロセスに切り替えることができません(タスクマネージャーでも開けません)。運が良ければ、IDE でプロセスを停止できます。ほとんどの場合、アクセスを回復するには再起動/ログオフする必要があります。
フックを使用しないと存在しないため、問題がマウスフックに関連していることはわかっています。これは、私の hookprocedure が次のことだけを行っている場合でも同様です:
すなわち。単にフックの存在が問題を引き起こします。
globalhooks.dll で EventLog に何かを書き込むと、ブレークポイントにいるときでもまだアクティブであることがわかります。
WH_MOUSE_LL を介して lowlevelmouse フックを使用しようとしましたが、これは基本的に機能しますが、フックのインストール中やウィンドウのサイズ変更中に奇妙なマウス移動の遅延が発生します。また、ブレークポイントに到達すると数秒間フリーズしますが、少なくともシステムは約 5 秒後に回復します... したがって、このオプションは実行時間にも影響するため、さらに悪化します。
そもそもデバッグ中に WH_MOUSE フックがアプリをフリーズさせる理由はありますか?
windows - アプリケーション ウィンドウの検出
CBT Windows Hookを使用して、ウィンドウの作成/削除/最小-最大/移動サイズ イベントを検出します。
私はうまく機能しますが、通常のウィジェットからのイベントをフィルタリングする必要があります。実際には、ユーザーがウィンドウと見なすウィンドウについてのみ、CBT フックによって通知される必要があります。
次のようにウィンドウをフィルタリングしても、スプリアスなイベントが継続的に発生するため、私が直面している問題は私を怒らせます。
これらの偽のイベントは、影の効果、メニュー、および画面に表示されるすべてのものから発生します。
その子から実際のウィンドウをフィルタリングする堅牢な方法はありますか?
一部のアプリケーションは境界線なしでメインウィンドウを作成できるため、または同様のテストを避けWS_BORDER
ます...または間違っていますか?
c#-4.0 - 32ビットマシンで.NET4.0フレームワーク用にコンパイルすると、SetWindowsHookExは0を返します。
アプリケーションにフォーカスがない場合でも、押された3つのキーを取得するように低レベルのWindowsキーボードフックを設定しようとしています。これを行うために、私はSetWindowsHookExを次のように呼び出しています
これは、.NET Framework 3.5を使用する32ビットおよび64ビットマシンで機能していましたが、.NET Framework 4.0にアップグレードした後、32ビットマシンでは機能しなくなりました。
4.0 Frameworkを使用して、32ビットマシンと64ビットマシンの両方でこれを機能させるために、これを解決する方法を知っている人はいますか?
windows-7 - Win7 で UAC プロンプトを表示せずに GUI でグローバル フックを設定するにはどうすればよいですか?
SetWindowsHookEx でグローバルフックを設定したい。フックは hook.dll にラップされ、GUI ウィンドウの app.exe によって登録されます。Windows NT/XP ではすべて正常に動作します。しかし、Win7 では、どうすれば UAC プロンプトなしで app.exe プロセスを開始でき、hook.dll を正常にロードして Win7 にグローバル フックを登録できますか?? VC2005を使用しています。
どんなアイデアでも大歓迎です!!
最高の願い、ケビン
.net-3.5 - 「モジュールが見つかりません」で 32 ビット マシン上の .NET 4.0 で SetWindowsHookEx が失敗しますか?
このページで同様の質問を見つけましたが、回答を解釈する方法や、それらが本当に重複しているかどうかを判断する方法がわかりません。
コメント付きで、私が見つけた可能性のある重複は次のとおりです。
32 ビット マシンで .NET 4.0 フレームワーク用にコンパイルすると、SetWindowsHookEx は 0 を返します。
私の場合は 0 を返さないようですが、クラッシュしたときに報告されるハンドル (32 ビットの .NET 4.0) が、実行時に報告されるハンドル (32 ビットの .NET 3.5) とは大きく異なることに気付きました。クラッシュ ハンドル = 523727、ワーキング ハンドル = 172738378 など。
VS2008 デバッガー内で SetWindowsHookEx を呼び出すと、常に NULL が返される
Visual Studio の外部で実行しているときに問題を再現できます
-
アセンブリのロードに関する何かが変更されたため、LoadLibrary と GetProcAddress を使用して .NET 4.0 で user32.dll をロードする必要があることが削除された回答へのコメントに記載されていることを除いて、これは最も有望に思えます。ただし、それが見つからないのは私自身のモジュールであると確信していますが、これが当てはまるかどうかはわかりません。
Hans Passant による、その最後の回答に対する削除された回答に関する問題のコメントは次のとおりです。
.NET 4.0 を使用していますか? その CLR は、アセンブリのロード方法を変更し、LoadLibrary 呼び出しがなくなり、それらのモジュール ハンドルがなくなりました。代わりに GetEntryAssembly() を使用すると、別の修正になります。– Hans Passant 5 月 5 日 19:43
それで、ここの言葉は何ですか?.NET 4.0 を使用していますか? LoadLibrary("user32.dll") を使用して、使用可能な DLL ハンドルを取得しようとしましたか? – Hans Passant 5 月 6 日 15:43
これを行う必要はないと確信していますが、明らかに100%確実ではありません。これを変更する必要がある場合に私が残した問題は、.NET 用にコンパイルすると 64 ビット OS で動作するAny CPU
のに、どの構成でも 32 ビットでは動作しない理由です。
.NET アセンブリの読み込みに関して実際に何かが変更されたため、クラス ライブラリの適切なハンドルを取得できない場合、次の質問があります。
- .NET 3.5 にダウングレードしたり、フック ライブラリを管理対象外に変更したりすることなく、これをだまして自分のやりたいことを実行させる方法はありますか?
- 64 ビット OS では動作するのに、32 ビットでは動作しないのはなぜですか?
バックグラウンド
キーの押下をキャプチャする WH_KEYBOARD_LL フック タイプで SetWindowsHookEx を使用するプログラムを .NET 4.0 で作成しました。これは私の 64 ビット Windows 7 では問題なく動作しますが、キーボード フックが 32 ビット Windows 7 にインストールされていると、「モジュールが見つかりません」というメッセージが表示されてクラッシュします。
これが私が試したことです:
- x86 用にコンパイルし、64 ビット OS で実行すると、「モジュールが見つかりません」でクラッシュする
- x86 用にコンパイル、32 ビット OS で実行、クラッシュ
- 任意の CPU 用にコンパイル、64 ビット OS で実行、問題なく動作
- 任意の CPU 用にコンパイル、32 ビット OS で実行、クラッシュ
- .NET 3.5 に切り替えて、上記の 4 つのケースを繰り返すと、すべて機能します
私はコードを .NET 3.5 に切り替えたくありません。作業を容易にするためにいくつかのクラス ライブラリを使用しており、最新のコードは .NET 4.0 しかないからです。
必要に応じて、すべてを含む .ZIP ファイルを Visual Studio 2010 プロジェクトとしてダウンロードするか、次の 2 つのファイルに貼り付けることができます。
そのルートをたどりたい場合に再作成するには:
- 新しいコンソール プロジェクト、.NET 4.0 を作成します。
- 別のクラス ライブラリ プロジェクトを追加します。これも .NET 4.0 です。
- コンソール プログラム プロジェクトからクラス ライブラリ プロジェクトへの参照を追加します。
- 以下の Program.cs コンテンツを、コンソール プロジェクトにある Program.cs ファイルに貼り付けます。
- 以下の Hook.cs コンテンツを class-library プロジェクトのファイルに貼り付けます。これを Class1.cs の既定のファイルに貼り付けるか、別のファイルを追加できます。これをコンソールプロジェクトに入れることはできません
次に、ビルドして実行し、さまざまな構成をテストします。
Program.cs
Hook.cs
c# - SetWindowsHookExはC#では機能していないようです(WH_KEYBOARD_LL、グローバル)
私のアプリケーションは、ユーザーがWindowsで特定のキーを押すたびに、何らかのアクションを実行する必要があります。
SetWindowsHookEx
オプションで呼び出すWH_KEYBOARD_LL
ことは、これを達成するための標準的な方法のようです。しかし、私の場合、何かが明らかに間違っていて、コールバックが実行されません。
デバッグコンソールアプリケーションの主な方法:
GetCurrentModuleHandleメソッド:
user32.dll
およびからのインポートkernel32.dll
:
私の問題が何か分かりますか?
windows - Windows 64 ビット上のアプリケーションで、64 ビットと 32 ビットの両方のエミュレーション レイヤーでコードを実行する方法はありますか?
エミュレーション レイヤーなしで一部のコードと 32 ビット エミュレーション レイヤー内の一部のコードを呼び出すことができるアプリケーションを作成できるかどうかに興味があります。
その主な理由は、API SetWindowHook を使用する必要があり、64 ビット アプリケーションと 32 ビット アプリケーションの両方にフックを設定したいからです。
確かに、2 つのアプリケーション (1 つは 32 ビット用、もう 1 つは 64 ビット用) を作成し、それらを同時に起動できます。ただし、それらを管理するためのコード (開始、停止、アップグレードなど) がさらに必要になります。
それで、1つのアプリケーションを持つことが本当に可能かどうかを探しています。
私が持っている唯一のアイデアは、1 つのアプリケーションと 2 つの COM DLL (32 ビットと 64 ビット) を用意し、代理プロセスを使用して 32 ビットのコードを実行することです。ただし、追加の COM ラッパーなどが必要になります。