問題タブ [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.
winapi - Win32 グローバル キー フック / SetWindowsHook / GetAsyncKeyState が機能しないことがある
仮想キーのフックについて質問があります。アプリケーションのグローバル ショートカットを定義したいと思います (RegisterHotkey では十分ではありません)。ただし、ショートカットを実装する 2 つの方法を試しました。
WH_KEYBOARD_LL フックを登録しました。すべてのフック コードを DLL に入れると、正常に動作します。ただし: 特別なアプリケーション ( CCleaner など) にフォーカスがある場合、フックは機能しなくなります。私のアプリケーションには何も届きません。32ビットと64ビットのDLLで試してみました。
フックを使用する代わりに GetAsyncKeyState を頻繁に呼び出すことで問題を解決しようとしました。また、このバージョンは、特別なアプリケーション (再び CCleaner ) が注目されるまではうまく機能します。この時点で、キーが押された場合でも、GetAsyncKeyState はすべてのキーに対して 0 を返します。
この問題を修正する方法を知っている人はいますか?
ところで、私のフックを無効にするアプリケーションは Delphi で書かれているようです。これらの「悪意のある」アプリケーションはさらに、どの入力にも反応しません。つまり、これらのアプリケーションのウィンドウで ShowWindow を呼び出しても効果がありません。SetWindowLong などについても同様です。
ご回答ありがとうございます。
c++builder - Borland C++ Builder で LowLevelKeyboardProc で SetWindowsHookEx を使用できない
実行中に一部のキーボード入力をブロックする必要があるソフトウェアを開発しています。この希望を放棄するいくつかの問題について話し合ったので、ここでは詳細を繰り返しません (状況をよりよく理解するために、これを読んでください: How can I disable specific Windows hotkeys from inside a software using C++? )
私の現在の問題は、Qt でやりたいことを実行できたことです。今度はそれを Borland C++ Builder 6 に渡す必要がありますが、Builder のコンパイラはコードを拒否しています。
指摘
[C++ エラー] FrmMain.cpp(155): E2034 'long (__stdcall *)(int,unsigned int,long)' を 'int (__stdcall *)()' に変換できません
Qt がこのコード行でまったく問題を検出せず、すべてが正常に実行されると、これは非常に奇妙です。問題は、「SetWindowsHookEx」に「LowLevelKeyboardProc」が含まれていることです。コードをいくつか変更してみましたが、成功しませんでした。
誰かが私にこれを手伝ってくれませんか?
ありがとう、
モメルギル
注: コードの詳細については、私が投稿したリンクにアクセスしてください。
winapi - ローカルフックが機能しない
私はアプリケーションを持っていて、MSWord のキープレス (LOCAL HOOK) を監視したいのですが、使用する pid を見つける方法がわかりません! 以下の CODE WORKS GOOD は、グローバル フック ( pid
= 0
) と ( pid
= GetCurrentThreadId
) で動作します。ただし、次の場合は機能しませんGetWindowThreadProcessId
:
私は問題の光に非常に感謝しています...
知らせ:
MSWordのみへのフックが必要です。
上記のコードは機能しますが、別のアプリケーションをフックしようとした場合 (つまり、
pid
=0
またはpid
=を使用しない場合GetCurrentThreadId
) にのみ失敗し、結果として = "マウス フックをインストールできません!" が発生します。.私はすでに試して
FindWindow
いますFindWindowEx
、、、; これはうまくいかないので、問題は.GetForegroundWindow
GetActiveWindow
GetWindowThreadProcessId
dll - 奇妙なフックの動作32/64ビット
私は(WH_KEYBOARD)
msword(OpusApp)でローカルフックを使用しています。まあ、私が知る限り、32ビットアプリはで32bit DLL
のみ動作する必要があり32bit target applications
ます。奇妙なことに、このプログラムは64ビットアプリでしか動作しません!!! それだけ64bits APPS
です!たとえば、it works with IE 64 but not with IE 32!
アプリdll
は32ビットでコンパイルされてradstudio XE2
おり、バージョンをPEヘッダーに確認しました。32ビットOSでは、アプリとdllは機能しません。
私はネット上で解決策を見つけられず、この奇妙な問題を解決するための出発点も見当たりません。
DLLコード:
EXE呼び出しコード:
c++ - SetWindowsHookEx を使用する C++ は、奇妙な vcl コードが追加された場合にのみ機能します。BCB2009で
SetWindowsHookEx を使用すると奇妙な状況が発生します
フォームとメモを含む bcb 2009 プロジェクトがあります。
create では、DLL をロードし、関数ハンドラを両側にアタッチします。
アイデアは、キーボードが打たれるとメモ ボックスにメッセージが表示され、マウス イベントが発生すると別のテキストがメモ ボックスに表示されるというものです。
奇妙なことに、デバッグ情報からコードを消去すると、コードが機能しなくなります。これは、フックが 1 回トリガーされ、それが終了したことを意味します。デバッグでは、いくつかの VCL TStringList を使用してキー ストローク データをディスクに記録しました。そのコードで遊んで、追加することで最終的にそれを検出しました
[コード]
フック機能 (キーボード、マウス) のすべてに対して、コードは再び機能します。
これを行う必要があるコードの何が問題になっていますか?
dllを作るのは15年ぶりです。そのため、dll の作成や関数のエクスポートにおいて、本当に基本的なことができます。
どんな提案も大歓迎です。
よろしく
JVDN
新しい追加情報:
[解決]私のターゲットはwin XP組み込みです。私のアプリケーションは、ウィンドウによってエクスプローラーを閉じるエラーを作成します。また、フックはXPではグローバルではなく、ローカルでのみ機能します。しかし、それは私の開発プラットフォームで作業しており、メモ帳でグローバルなタイピングとマウス操作を行うと、アプリケーションにメッセージが表示されます。[解決策] WH_KEYBOARD を WH_KEYBOARD_LL に変更し、マウスを WH_MOUSE から WH_MOUSE_LL に変更すると、Windows XP Embedded でのキーとマウスの受信が解決されます。
dll とアプリケーションの両方に、ランタイム ライブラリまたはパッケージがありません。
DLL コード
[コード]
で、申し込みはこちら。
[コード cpp]
そしてフォームヘッダー
[コード]
c# - SetWindowsHookEx がエラー 1428 で失敗する
次のコードでスタートボタンにフックしようとします。
SetWindowHookEx で常にエラー 1428 ERROR_HOOK_NEEDS_HMOD が発生する
モジュール ハンドルなしで非ローカル フックを設定することはできません。
私はこれを理解できません。を呼び出していますが失敗しますGetModuleHandle(null)
。
c++ - スポーンしたプロセスのアクティビティを監視するにはどうすればよいですか?
私は、最初のプログラムから生成されたすべてのGUIプログラムのアクティビティを監視し、設定された期間非アクティブになったときにそれらを強制終了するという任務を負っています。ユーザーが(最初のプログラムによって生成されたのではなく)しばらくの間別のプログラムを使用している場合でも、プログラムを閉じる必要があるため、これはシステムアクティビティではありません。アプリケーションの生成プロセスは.Netプログラムであり、変更されることはありません。SetWindowsHookEx
.Netから低レベルのフック(WH_KEYBOARD_LL
および)を設定するために使用できましWH_MOUSE_LL
たが、メッセージを開始したプロセスに関連付ける方法がわかりませんでした(を使用してSystem.Diagnostics.Process
)。フックを実行するアプリケーションからイベントをフックすることはできましたが、生成されたプログラムの特定のスレッドにフックしようとすると、常に失敗します。
SetWindowsHookEx
私が到達できた最も近い方法は、.Netプログラムに代わって呼び出すC++dllを作成することでした。このメソッドを使用すると、生成されたnotepad.exeの最初のスレッドにフックできますが、コールバック関数が呼び出されることはありません。SetWindowsHookEx
スレッドIDを0に指定すると、元のアプリケーションにアクティビティがあるときにコールバックが呼び出されるため、その場合の動作がわかります。
私はまだフックを完全には理解していませんが、dllコールバック関数のアドレスはフックされたプロセスにとって無意味であるため、私が読んだことからこれは機能しません。それは私が直面している問題ですか?もしそうなら、これを回避する方法はありますか、または誰かがスポーンされたプロセスがアクティブに使用されているかどうかを判断するための代替案を提案できますか?
.Net(C#)コード:
C ++ dll:
これらはすべて、現在32ビットのWindowsXPコンピュータで実行されています。生成された64ビットアプリケーションを処理するには、別の64ビットdllが必要になることを理解しています。
windows - WH_MOUSE_LL hook, avoid getting useless WM_MOUSEMOVE events
Is there a way, even a dirty hack, to avoid receiving WM_MOUSEMOVE
events in a WH_MOUSE_LL
hook? I'm interested only in wheel rotations and buttons. The performance cost of receiving WM_MOUSEMOVE
is unnacceptable in my scenario.
I cannot use WH_MOUSE
.
windows - Windowsで画面の再描画イベントをフックする(画面の中間レベルを作成する)方法は?
Screen を中間レベルとしてレンダリングする方法を考えています。
つまり、画面を再描画するたびに、画面が実際にモニターに表示される前に、画面 HDC を生成できます。
たとえば、Window 7 の拡大鏡ユーティリティです。拡大鏡ウィンドウの下にコンテンツが表示されますが、どのように作成されているのでしょうか?
ありがとうございました :-)
よろしく、ザビエル・ワン。
winapi - WH_KEYBOARD_LL フックは、自身のプロセスで入力をキャプチャしません
低レベルのキーボード フック (WH_KEYBOARD_LL) を使用して、Alt-Tab などの特定の入力を無効にしています。メッセージ ポンプを使用してスレッドにフックを作成し、通知を適切に処理できるようにします。
フックのコールバック関数は、フックを作成したウィンドウ (つまり、メイン ウィンドウ) にフォーカスしていないときはいつでもキーボード イベントを処理できますが、そのウィンドウをアクティブにするとすぐに、フックを非アクティブにするまでフックにイベントが表示されません。ウィンドウを再度開き、代わりに入力がウィンドウの WindowProc に伝達されます。
ここで何が起こっているのか、誰にも手がかりがありますか?
更新:したがって、この動作は、同じプロセスで生の入力も登録することによって引き起こされることがわかりました。どうやら、生の入力を使用すると、プロセスのウィンドウがフォーカスされるたびに、低レベルのキーボード フックが無効になります。これを回避する理由と方法を知っている人はいますか?