Использование низкоуровневой клавиатуры для изменения символов клавиатуры

Я создаю пользовательскую раскладку клавиатуры. В качестве начального шага я хочу, чтобы пользователь нажал клавишу, перехватил клавиатурный крючок и выдал другой ключ по моему выбору.

Я нашел этот код крючка клавиатуры, который я пытаюсь слегка изменить для своих целей: 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 ошибке A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe .

Что я могу сделать здесь, чтобы перехватить клавиатурный крючок и заменить его персонажем по своему выбору?

Спасибо!

    Второй параметр для Marshal.PtrToStructure должен быть classом, а не структурой, а KBDLLHOOKSTRUCT – это, вероятно, структура.

    Вместо этого вы должны использовать его следующим образом:

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