この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 17857|答える: 0

[ヒント] C#プログラミングスキルにおけるフック関数の利用 - SetWindowsHookEx

[リンクをコピー]
掲載地 2019/02/07 21:12:59 | | |
ご存知の通り、C#は.NET Frameworkプラットフォームの伴随言語であり、独自のライブラリやコンパイラの提供でグローバルフックを実装することはできません。 しかし実際には、DllImportプロパティを使ってUnmanaged Codeライブラリのメソッドを参照することで、C#では非マネージドコードの呼び出しが真実です。 フック関数はuser32.dll存在し、関数のプロトタイプは以下の通りです。

HHOOK WINAPI SetWindowsHookEx(

__in idHook に感謝、

__in HOOKPROC lpfn、

__in HINSTANCE hMod について、

__in DWORD dwThreadId);

特定のメッセージ傍受処理方法をオペレーティングシステム(Windows)で登録するために使えます。例えば、グローバルキーボードメッセージをブロックするフックを登録することで、すべてのキーボードの押し上げや持ち上げイベントを認識・処理できるようになります(メッセージをドロップするためのフロントエンドフックが存在する可能性は否定されません)。

この関数はC#で次のように宣言することで参照できます:

  [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(
            HookType idHook、
            HookProc lpfn、
            IntPtr hInstance、
            int threadId
            );

上記のHookTypeとHookProcは私のカスタム型ですが、これは重要ではありません(プログラムが実行中にメモリアドレスを渡すため)。ただし、特定の仕様を満たす必要があります。

関数のパラメータは上から下へ次の通りです:

  idHook型で、ここでは形状付きエナックで表されます
     フックが使われたときのLPFNコールバック関数
     hInstance モジュールハンドル(通常はフックコールバック関数があるアプリケーションインスタンスのモジュールハンドル)
       threadIdインストールされたフックサブルーチンに関連付けられたスレッドの識別子

フックにはいくつかの種類があります:
一般的にはキーボードメッセージをブロックするために13、マウスメッセージをブロックするために14を使っています。

コールバック関数の宣言C#ではdelegateを使う必要があり、宣言は以下の通りです:
    public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

トップダウンパラメータはnCodeフックチェーンで返されるパラメータを意味し、0はこのメッセージ(前のメッセージフックによるもの)が破棄されることを意味します。非0はこのメッセージが有効であり続けることを意味します

wParamメッセージパラメータ

lParamメッセージパラメータ

wParamとlParamは異なるメッセージタイプの異なるタイプであることは特筆に値しますが、wParamの種類は大まかに以下の列挙で表せます。
lParamは一般的に構造としてカプセル化され、メッセージの種類によって異なります。以下の2つの構造がマウスとキーボードのメッセージのlParam構造です。
上記の情報を理解することで、C#によるフック関数の基本的な実装ができ、いくつかの質問に注目してください。

1. フックは多くのリソースを消費し、使用していない時は時間内にキャンセルする必要があります。そのためにはUnhookWindowsHookEx関数の使用が必要です

2. 礼儀として、フックは現在のフックの処理結果ではなく、次のフックの処理結果を返すべきです(CallNextHookExを使って次のフックを呼び出してください。フックが先に設定されてから発効するため、フックチェーンの通常の配信を確実にするために行うべきです)。

3. フック関数パラメータ内のhInstanceは、現在のフックのコールバック関数が位置する場所のみであり、正しいアドレスが指定されなければなりません

4. デリゲートが使用されるため、デリゲートのメモリアドレス(メソッド参照)がガルバッグされないようにしなければ、フック実行時に例外が発生することになります



私が書いたサンプルプログラムをダウンロードできますが、私のプログラムには以下の主要なポイントが必要です:

1. フックの実装をブロックし、キーボードとマウスのメッセージ傍受と処理だけを開放しました(使用方法はC#のWinFormのマウスとキーボードイベントと同じです)。他のものも開けます

2. フックはシングルモードに設計したのでキャンセルできます

3. オペレーティングシステムへの特定の侵入により、アンチウイルスソフトウェアはリスクがあると報告されることがあります

4. コードは粗雑に書かれているので、なんとか使い切ってください......



最後に、プログラミング技術と言語の違いは、コンパイラとユーザーが異なる点にあります。Cを使う人がJavaを使う人より優れているとは言えず、技術は必ずしもポインタや行列、データ構造に反映されているわけではなく、コンピュータの原理、コンパイルの原則、オペレーティングシステムの原則などを理解している人がいる限りです。 もちろん、誰もが自分の好きな言語や通常のプログラミング方法を持っているのは良いことです。





先の:純粋なC#フック実装
次に:【江石WeChatマルチオープン】WeChatスキャンコード 任意ログイン|無制限マルチオープン|保存ログイン設定
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com