2010-01-14 3 views
2

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

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

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

Спасибо!

ответ

4

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

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

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

Visual Studio говорит мне, что это 'Marshal.PtrToStructure (IntPtr PTR, структура объекта);' ... делает это джайв с тем, что вы говорите? Он не бросает ошибку или что-то еще, компилируется просто отлично. – cksubs

+0

Он компилируется отлично, но выдает «ArgumentException» во время выполнения. –

+0

Почему это было бы названо PtrToStructure, если бы это не спасло Ptr в структуре? Но если мне нужно его изменить, что мне здесь делать? Если я не могу использовать структуру KBD, чтобы сохранить указатель на структуру KBD, как мне ее изменить? – cksubs

Смежные вопросы