You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中读取WM_SETTINGCHANGE消息的LParam参数?

如何在C#中读取WM_SETTINGCHANGE消息的LParam类别信息?

我在WndProc中接收到WM_SETTINGCHANGE消息后,想要获取LParam字段里的类别信息,但尝试的代码触发了内存访问冲突异常。尝试的代码如下:

var mystr = new COPYDATASTRUCT();
var mytype = mystr.GetType();
mystr = (COPYDATASTRUCT) wMsg.GetLParam(mytype)!; // 此处引发系统内存访问冲突
var textReceived = mystr.lpData;
// System.AccessViolationException: 'Attempted to read or write protected memory

我意识到不同WM_*消息的LParam访问方式有区别,想知道该如何正确解引用或复制LParam来获取WM_SETTINGCHANGE指向的类别。


解决方案

WM_SETTINGCHANGE的LParam本身就是指向字符串的指针,不需要用COPYDATASTRUCT解析(该结构仅适用于WM_COPYDATA消息)。直接通过Marshal.PtrToStringAuto()方法即可将指针转换为C#字符串。

正确实现代码如下:

case WM_SETTINGCHANGE:
    // 用户切换深色模式时会收到两次该消息
    var text = Marshal.PtrToStringAuto(wMsg.LParam);
    var msg = $"WM_SETTINGCHANGE received: W:{wMsg.WParam} - L: {text}";
    MessageBox.Show(msg);

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:27:03