Я нашел этот код перехвата клавиатуры, который я пытаюсь немного изменить для моих целей: 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.
ОДНАКО, приложение в фокусе все еще печатает 'E' вместо 'Z'. Зачем? Я изменил ввод с клавиатуры на «Z» вместо «E», и строки консоли показывают, что он был изменен правильно!
Насколько я понимаю, вызов return CallNextHookEx(_hookID, nCode, wParam, lParam);
- это то, что посылает команду "напечатать это сейчас" в открытое приложение. Разве это не так? Есть ли что-то, что мешает мне печатать нужный символ? Я знаю, что такие приложения, как AutoHotkey, берут клавишу ввода, проверяют ее и возвращают другой символ. Как мне сделать то же самое здесь?
Спасибо!