Использование низкоуровневой клавиатуры для изменения символов клавиатуры - PullRequest
2 голосов
/ 14 января 2010

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

Я нашел этот код перехвата клавиатуры, который я пытаюсь немного изменить для своих целей: 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.

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

Спасибо!

1 Ответ

4 голосов
/ 14 января 2010

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

Вместо этого вы должны использовать это так:

KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...