c# - 使用 Marshal 类时代码未执行的问题
问题描述
我一直在用 c# 编写一个低级键盘钩子。它工作得很好,在按下任何键后,回调方法被执行,但是如果我尝试使用类似Marshal.ReadInt32
或Marshal.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 行:
这是为什么?
解决方案
用这个:
int wP = wParam.ToInt32();
看来您正在为 WH_KEYBOARD_LL 或 WH_KEYBOARD 安装键盘挂钩。在这种情况下, wParam 值包含 WM_KEYDOWN (0x0100) 或 WM_KEYUP (0x0101) - 如您所说。您可以从 lParam 获取虚拟键码 - 这应该是一个有效的指针。因此,您可以将 marshal 函数用于 lParam:
int keyCode = Marshal.ReadInt32(lParam);
推荐阅读
- node.js - 聚合并发的 AWS DocumentDB 性能问题
- angular - PrimeNG 下拉按钮没有反应/正常工作
- xcode - 如何抑制来自 Generate DSYMFile 的警告?
- reinforcement-learning - openAI 五中的超参数
- node.js - 用猫鼬模拟开玩笑
- hyper-v - 对 Hyper-V 工作组配置的 WinRM 进行故障排除
- vue.js - 如何在 Vue.js 中使用不同的端口和相同的路径设置多个代理
- ios - 下载地址失败
- ios - 如何在复制的 ios 项目中更改 firestore 数据库?
- java - asynctask 在带有 api 24 的模拟器中工作,而不是在带有 api 28 的真实设备中工作