首页 > 解决方案 > 使用 Marshal 类时代码未执行的问题

问题描述

我一直在用 c# 编写一个低级键盘钩子。它工作得很好,在按下任何键后,回调方法被执行,但是如果我尝试使用类似Marshal.ReadInt32Marshal.Copy在回调方法中的东西,那么我的代码将停止在我使用Marshal类的地方执行,就像使用Marshal类一样工作就像一个返回陈述。

private static IntPtr OnKeyEvent(int code, IntPtr wParam, IntPtr lParam)   
{
    Console.WriteLine("Before");
    int wP = Marshal.ReadInt32(wParam);            
    Console.WriteLine("After");

    return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
}

结果是:

之前,之前,之前,之前,之前等

如果我注释掉 Marshal.ReadInt32 行:

之前,之后,之前,之后等

这是为什么?

标签: c#

解决方案


用这个:

int wP = wParam.ToInt32();

看来您正在为 WH_KEYBOARD_LL 或 WH_KEYBOARD 安装键盘挂钩。在这种情况下, wParam 值包含 WM_KEYDOWN (0x0100) 或 WM_KEYUP (0x0101) - 如您所说。您可以从 lParam 获取虚拟键码 - 这应该是一个有效的指针。因此,您可以将 marshal 函数用于 lParam:

int keyCode = Marshal.ReadInt32(lParam);

推荐阅读