在我的 WndProc 中,我收到一条 WM_SETTINGCHANGE 消息,我想在传入消息的 LParam 字段中查看调用者发送的类别。尽可能地尝试(并且在到处搜索之后),我找不到任何显示如何将原始字符串放入我可以看到的 C# 中的内容。我得到的最好的是下面的代码,但它会导致系统访问冲突,试图在 GetLParam 调用时读取受保护的内存。
我觉得访问 LParam 的方法因每个不同的 WM_* 消息类型而异。
var mystr = new COPYDATASTRUCT();
var mytype = mystr.GetType();
mystr = (COPYDATASTRUCT) wMsg.GetLParam(mytype)!; // sys access violation here
var textReceived = mystr.lpData;
// System.AccessViolationException: 'Attempted to read or write protected memory
如何取消引用或复制 LParam,以便我可以看到 WM_SETTINGCHANGE 指的是哪个类别?谢谢。
WM_SETTINGCHANGE
文档:
lParam 是一个指向字符串的指针,该字符串指示包含已更改的系统参数的区域。该参数通常不指示更改了哪个特定系统参数。 (请注意,某些应用程序发送此消息时 lParam 设置为 NULL。)通常,当您收到此消息时,您应该检查并重新加载应用程序使用的任何系统参数设置。
PtrToStringAuto()
或 PtrToStringUni()
从 lParam
. 访问字符串