8

このキーボード フック コードを見つけました。目的のために少し変更しようとしています: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx

概要として、ユーザーにキーを押して「E」と言ってもらい、キーボードがフォーカスされているアプリに別の文字「Z」を返すようにします。

変更した関連メソッドは次のようになります。

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            //The truely typed character:
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);

            KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
            replacementKey.vkCode = 90; // char 'Z'
            Marshal.StructureToPtr(replacementKey, lParam, false);

            //Now changed to my set character
            vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine((Keys)vkCode);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

コンソールはこれを次のように正しく出力します。

E
Z
T
Z
G
Z
etc.

ただし、フォーカス中のアプリは「Z」ではなく「E」と入力します。なんで?フックされたキーボード入力を「E」の代わりに「Z」を含むように変更しました。コンソールの行は、それが正しく変更されたことを示しています!

私が理解しているように、を呼び出すと、return CallNextHookEx(_hookID, nCode, wParam, lParam);「これを今すぐ印刷」コマンドが開いているアプリに送信されます。それが機能する方法ではありませんか?必要な文字を入力できない原因はありますか? AutoHotkey のようなアプリが入力キーを受け取り、それをチェックして、別の文字を返すことは知っています。ここで同じことを行うにはどうすればよいですか?

ありがとう!

4

2 に答える 2

5

これは以前やったことがありますが、少し違います。
に送信されるパラメータを変更しようとする代わりにCallNextHookEx、キーを押したままにしました (フック プロシージャからゼロ以外の値を返すことで、後続のプロシージャが呼び出されないようにすることができます)。

次に、 SendInputを使用して、「注入」したい新しいキーを送信しました。

したがって、基本的には次のように機能します。

  • フック プロシージャは、ターゲット キーが押されたことを識別します。
  • 新しいキーを使用して SendInput を呼び出します
  • 元のキーを無視するには、フック プロシージャから 1 を返します。

サイクリック リダイレクト、つまり「a」が「b」にリダイレクトされ、「a」にリダイレクトされると、簡単に爆発する可能性があります ;)

于 2010-01-14T21:06:00.030 に答える
0

ほとんどの場合、「システム全体」ではなく「スレッド全体」でフックをインストールしました。つまり、フックをインストールするスレッドに対してのみキー変換が行われます。

「システム全体」でインストールするには、「フック プロバイダー」を持つ dll とそれを管理する exe の 2 つの部分が必要です。ここに良いチュートリアルが あります http://www.codeproject.com/KB/system/hooksys.aspx とここに例があります: http://www.codeguru.com/cpp/com-tech/shell/article.php/c4509 /

ただし: 1. システム全体のフックをインストールすると、システムがひどく壊れる可能性があります (変換しないキーを転送するようにしてください)。2. お願い... 別のキーロガーを作成しないでください

于 2010-01-14T21:05:07.920 に答える