如何在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
相关产品推荐
相关产品推荐

