我创建一个自定义的键盘布局。为起点一步,我希望让用户按下一个键,有我的键盘钩子截获它,并输出我选择的不同的密钥。

我发现这个键盘钩子代码,我想稍微修改一下我的目的: 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);
}

我希望它宣布一个新的病区结构对象,复制由键盘钩子供应到它的大骨节病结构,修改我的对象的vkCode使用不同的字符,然后用我的修改后的版本覆盖提供的对象。这样应该可以把一切都相同,除了它写一个不同的角色这一事实。

不幸的是,它不工作。原来的键盘字符键入。在Visual Studio输出窗格也得到了A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe错误。

我可以在这里做拦截键盘钩子,用我选择的字符替换?

谢谢!

有帮助吗?

解决方案

Marshal.PtrToStructure第二个参数必须是类不是结构和KBDLLHOOKSTRUCT可能是一个结构体。

相反,你应该使用这样的:

KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, false);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top