C# キーボード フック

Nov 10, 2016 am 10:02 AM

キーボードフックは、釣りに行くとき、魚が餌を取る限り、どんなに逃げても、フックのロープを制御している限り、いつでも魚を見つけることができるコマンドです。キーボード フックは、コンピュータを使用してコードを 1 行ずつ実行し、宛先ウィンドウがキー コードを処理する前に特定の命令をインターセプトして別の命令に置き換え、そのようなサイクルの後に宛先ウィンドウにメッセージを送信する機能です。ウィンドウ プログラムはユーザー入力が現在の値であるか、入力がないと判断しますが、キーボード フックは一部の犯罪者の手に渡り、アカウントの窃盗やパスワードの監視などの違法な操作となっています。プロトタイプ: HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);

// Win32 keyboard hook.
public const int WH_KEYBOARD_LL = 13;
public const int NULL = 0;
 
public delegate int HookProc(int code, int wParam, KBDLLHOOKSTRUCT lParam);
 
[DllImport("user32.dll", SetLastError = true)]
public static extern int SetWindowsHookEx(int hookType, HookProc lpfn, int hMod, int dwThreadId);
 
[DllImport("User32.dll", SetLastError = true)]
public extern static int CallNextHookEx(int handle, int code, int wParam, KBDLLHOOKSTRUCT lParam);
 
[StructLayout(LayoutKind.Sequential)]
public class KBDLLHOOKSTRUCT
{
    public uint vkCode;
    public uint scanCode;
    public KBDLLHOOKSTRUCT flags;
    public uint time;
    public UIntPtr dwExtraInfo;
}
 
[Flags]
public enum KBDLLHOOKSTRUCT : uint
{
    LLKHF_EXTENDED = 0x01,
    LLKHF_INJECTED = 0x10,
    LLKHF_ALTDOWN = 0x20,
    LLKHF_UP = 0x80,
}
 
public volatile int hHook;
 
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    // 安装全局键盘钩子
    if ((this.hHook = SetWindowsHookEx(WH_KEYBOARD_LL, this.KeyBoardProc, NULL, NULL)) == NULL)
        Console.WriteLine("Unable to establish a keyboard hook.");
}
 
protected int KeyBoardProc(int code, int wParam, KBDLLHOOKSTRUCT lParam)
{
    if (lParam.vkCode == (int)Keys.A)
        return 1; // <span style="font-family: arial, 宋体, sans-serif;font-size:18px; line-height: 24px; text-indent: 28px;">返回1表示拦截消息,返回0表示放行</span>
    return CallNextHookEx(hHook, code, wParam, lParam);
}
ログイン後にコピー

システム内のすべてのプロセス キーボード メッセージを監視します:
SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, NULL, NULL)

<pre name="code" class="csharp">        // Win32 keyboard hook.
        public const int WH_KEYBOARD = 2;
        public const int NULL = 0;
 
        public delegate int HookProc(int code, int wParam, int lParam);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int GetCurrentThreadId();
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern int SetWindowsHookEx(int hookType, HookProc lpfn, int hMod, int dwThreadId);
 
        [DllImport("User32.dll", SetLastError = true)]
        public extern static int CallNextHookEx(int handle, int code, int wParam, int lParam);
 
        public volatile int hHook;
 
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
<pre name="code" class="csharp" style="line-height: 24px;font-size:18px;">            // 安装键盘钩子
ログイン後にコピー
if ((this.hHook = SetWindowsHookEx(WH_KEYBOARD, KeyBoardProc, NULL, 
GetCurrentThreadId())) == NULL) Console.WriteLine("Unable to establish a
 keyboard hook."); }
ログイン後にコピー
protected int KeyBoardQueue(int code, int wParam, int lParam)
{
    if (wParam == (int)Keys.A)
       
 return 1; <span style="font-family: arial, 宋体, sans-serif;">// 
</span><span style="font-family: arial, 宋体, 
sans-serif;">返回1表示拦截消息,返回0表示放行</span>
    return CallNextHookEx(hHook, code, wParam, lParam);
}
ログイン後にコピー

すべてのキーボード メッセージを監視このプロセスの場合:

SetWindowsHookEx(WH_KEYBOARD, KeyBoardProc, NULL, GetCurrentThreadId());

protected int KeyBoardProc(int code, int wParam, int lParam)
   {
       if (wParam == (int)Keys.A)
           return 1;
       return CallNextHookEx(hHook, code, wParam, lParam);
   }
ログイン後にコピー


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

次のレベルのCコンパイラを追加する方法 次のレベルのCコンパイラを追加する方法 Mar 03, 2025 pm 05:44 PM

次のレベルのCコンパイラを追加する方法

C言語コンパイラによるコードをコピーする方法 C言語コンパイラによるコードをコピーする方法 Mar 03, 2025 pm 05:43 PM

C言語コンパイラによるコードをコピーする方法

C言語のnullの代替案は何ですか C言語のnullの代替案は何ですか Mar 03, 2025 pm 05:37 PM

C言語のnullの代替案は何ですか

C言語コンパイラのWebバージョンは何ですか? C言語コンパイラのWebバージョンは何ですか? Mar 03, 2025 pm 05:42 PM

C言語コンパイラのWebバージョンは何ですか?

どの言語コンパイラが優れていますか? どの言語コンパイラが優れていますか? Mar 03, 2025 pm 05:39 PM

どの言語コンパイラが優れていますか?

nullは、C言語での最新のプログラミングではまだ重要ですか? nullは、C言語での最新のプログラミングではまだ重要ですか? Mar 03, 2025 pm 05:35 PM

nullは、C言語での最新のプログラミングではまだ重要ですか?

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 Mar 03, 2025 pm 05:41 PM

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約

c言語コンパイラインストールチュートリアル(コンピューターバージョン) c言語コンパイラインストールチュートリアル(コンピューターバージョン) Mar 03, 2025 pm 05:41 PM

c言語コンパイラインストールチュートリアル(コンピューターバージョン)

See all articles