問題タブ [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.
windows - Windows アプリケーションのクリック追跡
私は、私が書いたのではなく、制御できないアプリケーションの使用状況の指標を収集することに興味があります。これは、Windows 上で動作するアプリケーションです。
これに対する私の計画は、マウスとキーボードのイベントのグローバル ウィンドウ フックを登録し、事前に決定されたタイトルまたはその他の識別可能な属性を持つウィンドウのイベントを記録することです。
このデータを使用して、ユーザーが問題のアプリケーションをどのように使用しているかを判断できることを願っています。どのボタンをいつクリックするか、および一般的なワークフロー。等。
このアイデアについて何か考えはありますか?既存のアプリケーションの変更を必要としないこのソリューションを容易にするサードパーティ製品またはライブラリはありますか?
multithreading - 低レベルのキーボード フックが UI スレッドにない
キーボード フック用の優れたライブラリを作成したいと考えています。メソッド SetWindowsHookEx を使用していますが、アプリのメイン スレッドがビジー状態の場合、システムの KeyDown イベントで呼び出されるメソッド hookProc が実行されないことに気付きました。他のスレッドが責任を負うように、フックを作成する必要があると思います。それは可能ですか?どうすればいいですか?
c# - Windows XP で SetWindowsHookEx を使用するとエラーが発生するが、Windows 7 ではエラーが発生しない
グローバル キーボード/マウス フックを使用するアプリケーションを開発しました。Windows 7 では完全に機能しますが、Windows XP では機能しません。
Windows XP で SetWindowsHookEx を呼び出すと、エラー コード 1428 が表示されます
c++ - ユーザーがキーをタップしたときにメッセージを表示する
次のスニペットは、ユーザーがキーを入力したときにメッセージを表示するためのものです。アプリケーションに焦点が当てられていない場合でも。しかし、次のコードには問題があるようです。ウィンドウでフックチェーンに登録された関数を呼び出しません。問題はにあると思いHINSTANCE hInst
ます。ユーザーがキーをタップしたときにメッセージを表示できるようにするには、以下のコードをどのように変更すればよいですか。
しかし、ウィンドウは関数を呼び出しませんLowLevelKeyboardProc
。理由はわかりませんが、問題はhInst
フック関数にあると確信しています。どのように初期化する必要がありますか?
今まで、私が見る出力はInside function setWinHook !
c++ - ウィンドウのウィンドウ手順をフックしようとしています。SetWindowsHookExが失敗してNULLHHOOKが返され、GetLastErrorがエラーコード126を返します
概要
ユーザーがトップレベルウィンドウを含むプロセスを選択できるようにする単純なアプリケーションを作成しています。ユーザーは最初にネイティブDLL(マネージDLLではない)のパスを入力します。次に、ユーザーはフックプロシージャ内で呼び出されるメソッドの名前を入力します。メソッドは値を返さないようにする必要があり、パラメーターを使用しない必要があります。次に、それらはフックを行うボタンです。
問題
フックを行うライブラリのモジュールハンドルを取得できます。さらに、ユーザーがフックしたいメソッドを含む、ユーザーが使用したいモジュールハンドルライブラリを取得することもできます。さらに、ユーザーがフックしたい方法などの両方に対応した手順を受け取ることができます。
言い換えれば、それらは無効なハンドルが返されることはありません。フックの取っ手以外(HHOOK)
ただし、SetWindowsHookExはNULL HHOOKを返し、GetLastErrorはエラーコード126(ERROR_NO_MOD_FOUND)を返します。
ERROR_MOD_NOT_FOUNDを取得する理由について考えられる理論
- フック時に同じエラーが発生した人とどこかで読んだため、グローバルフックの数には制限があります。
- フックを実行するDLLの正しいモジュールハンドルを取得していません。しかし、ライブラリHMODULE / HINSTANCEを取得するためにさまざまな方法を試しましたが、すべて同じエラーで失敗します。
WinHooker.cpp
Test.cpp
メインコード
結論
どんな助けでもいただければ幸いです。私が何か間違ったことをしている場合は、遠慮なく指摘してください。このプロジェクトは学習を目的としているので、修正が必要なものを教えてください。そうしないと、ヒントがあれば素晴らしいと思います。
c++ - ShowWindow が 64 ビット OS の DLL から動作しない?
SetWindowsHook
キーボードイベントをキャッチするために呼び出すプロセスがあります。イベントを処理する DLL でShowWindow
、フックを設定したプロセスのウィンドウのハンドルを条件付きで呼び出します。
このコードは 32 ビット OS (XP) で完全に動作し、64 ビット OS で 32 ビット アプリケーションとして動作しますが、64 ビットにコンパイルするとウィンドウが表示されません。
ウィンドウを表示するコードは次のとおりです。
c# - C ++ SetWindowsHookExをC#に移植する方法、またはこれは不可能ですか?
私はMicrosoftKB318804の例を見ていましたが、それらは「現在の」アプリケーションのthreadIdを使用しています!!! 動作するC++コードがいくつかありますが、それを書き直す必要があります。そこにいる間にC#で書き直したいと思います。それが行う1つのことは、次のようにターゲットアプリケーションのthreadIdを取得することです。
いいえ、GetCurrentThreadは正しい呼び出しではありません。これは、リモートアプリケーションのスレッドIDを取得しているためです。これは、今日行っていることであり、やりたいことです。targetHandleは、そのリモートアプリケーションへのハンドルです。
このlastIdをintにキャストし、C#コードを接続しようとしましたが、SetWindowsHookExは0を返し、失敗します。AppDomain.GetCurrentThreadId()のみが機能しているようです(非推奨ですが、置換も機能しません)。
それでは、C ++コードを使用する必要がありますか?または、C#で動作させる方法はありますか?
現在、C ++のフックハンドラーを他のアプリケーションに登録し、イベントを取得しています。
c# - 別のスレッドのKeyHook
私のC#アプリでは、キーフックを実行したいのですが、キーが押されたときに呼び出されるメソッドが別のスレッドで呼び出されるようにします。このようにして、アプリケーションが他の何かでビジー状態だったために、プログラムによってキーが省略されることはありません。どうすれば別のスレッドで作成できますか?フックを作成するスレッドによっては、キーが押されたときに呼び出されるメソッドがそのスレッドで呼び出されるという情報を見つけましたが、それは起こりません。フックしたスレッドに関係なく、このメソッドは常にメインスレッドで呼び出されます。助けてください。これが私のコードの概要です:
SetWindowsHookはこの方法で呼び出されますが、idはメソッドを別のスレッドで呼び出すように強制しません。
c++ - 実行時に読み込まれる DLL のインポート アドレス テーブルを変更する方法
実行時にロードされた DLL から呼び出される関数をフックしたいのですが、「Windows Via C/C++」という本のクラス CAPIHook を使用しました (Install System Wide フックによって行われる DLL インジェクションと、Modify IAT によるフック) が、これはコードは、実行可能ファイルの IAT に DLL 名/シンボルが存在する場合にのみ機能します。(つまり、暗黙的な DLL リンクの場合)
これは DLL コードです:
これはフック関数です:
IAT の交換方法:
作成者はこの機能を追加するためにコメントを追加しましたが、その方法がわかりません
注: 関数は、エクスポート モジュールが既に読み込まれている場合にのみフックできます。解決策は、関数名をメンバーとして保存することです。次に、フックされた LoadLibrary* ハンドラーで、CAPIHook インスタンスのリストを解析し、pszCalleeModName がロードされたモジュールの名前であるかどうかを確認して、そのエクスポート テーブルをフックし、ロードされたすべてのモジュールのインポート テーブルを再フックします。
彼はこれも本に書いていますが、どうすればいいのかわかりません
考えられる解決策は、フックされた LoadLibrary* 関数を使用して、モジュールがパッチが適用されていないフックされた関数をエクスポートしていることを検出し、次に 2 つのアクションを実行することです。
GetProcAddress を呼び出して、フックする関数の元の実装へのポインターを取得できるようになったため、既に読み込まれているモジュールのインポート テーブルを再度フックします。関数の名前をクラス メンバーとして格納し、コンストラクターで設定する必要があることに注意してください。
ReplaceEATEntryInOneMod 関数の実装によって示されるように、エクスポート モジュールのエクスポート アドレス テーブルでこのフック関数を直接更新します。そうすれば、フックされた関数を呼び出すすべての新しいモジュールがハンドラーを呼び出します
DLL のロード後に IAT を変更しようとしましたが、フック関数が呼び出されませんでした
では、このコードを変更して動的ローディングケースを処理するにはどうすればよいですか?
c++ - CreateProcessWithDLLEx-フックされたプロセスは開始されますが、再開できません
マイクロソフトの迂回路を使用して基本的なフックを取得しようとしています。私のプログラムはCreateProcessWithDllExを正常に実行し、dllを挿入することができます。しかし、実際のフックされたプログラムを再開することはできないようです。テストにメモ帳を使用していて、プロセスリストでnotepad.exeが実行されているのを確認できますが、メモ帳ウィンドウが実際に表示されることはありません。
私のdllは次のとおりです。
そして私のインジェクターは次のとおりです:
そして、.defファイルを使用してdllをビルドし、迂回が正しく機能するために序数1に必要な関数があることを確認します。
プロセスが実行されない原因を誰かが知っていますか?ちなみに、私は空白のdllでも試してみましたが、序数1で必要な関数が含まれているだけで、他には何も含まれておらず、同じ結果になるようです。
また、notepad.exeプロセスがプロセスリストに表示されている限り、インジェクターは永久に実行されます。これは、プロセスが正しく生成されたことを示しているように見えるWaitForSingleObjectへの応答です。