Я создаю пользовательскую раскладку клавиатуры. В качестве начального шага я хочу, чтобы пользователь нажал клавишу, перехватил мой хук клавиатуры и вывел другую клавишу по своему выбору.
Я нашел этот код перехвата клавиатуры, который я пытаюсь немного изменить для своих целей:
http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx
Я изменил соответствующий метод на это:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
KBDLLHOOKSTRUCT replacementKey = new KBDLLHOOKSTRUCT();
Marshal.PtrToStructure(lParam, replacementKey);
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, true);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
Я хочу, чтобы он объявил новый объект структуры KBD, скопировал в него структуру KBD, предоставленную крючком клавиатуры, изменил vkCode моего объекта, чтобы использовать другой символ, а затем переписал предоставленный объект моей измененной версией. Надо надеяться, что это должно сохранить все то же самое, за исключением того факта, что он пишет другой символ.
К сожалению, это не работает. Оригинальный символ клавиатуры набирается. Панель вывода Visual Studio также получает ошибку A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe
.
Что я могу сделать здесь, чтобы перехватить хук клавиатуры и заменить его на символ по моему выбору?
Спасибо!