Я нашел эту клавиатуру крюк код, который я пытаюсь немного изменить для моих целей: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspxМогу ли я изменить ввод клавиатуры пользователя?
В качестве обзора, я хочу, чтобы пользователь нажать клавишу, скажем, «Е», и есть возвращение клавиатуры другой символ, «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, берут ключ ввода, проверяют его и возвращают другой символ. Как мне сделать то же самое здесь?
Спасибо!
из любопытства, что это такое? –
Это не кейлоггер! :) Приложение является вспомогательной технологией.Подумайте о клавиатуре iPhone; за кулисами, он изменяет ключевую область, исправляет очевидные ошибки и запускает другой смарт-код, который поможет вам печатать быстрее и точнее. Это аналогичное приложение, но для полноценных клавиатур. – cksubs