このキーボード フック コードを見つけました。目的のために少し変更しようとしています: 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 のようなアプリが入力キーを受け取り、それをチェックして、別の文字を返すことは知っています。ここで同じことを行うにはどうすればよいですか?
ありがとう!