如何在 C# 中读取 WM_SETTINGCHANGE LParam?

问题描述 投票:0回答:1

在我的 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 指的是哪个类别?谢谢。

winapi wndproc lparam
1个回答
0
投票

根据

WM_SETTINGCHANGE
文档:

lParam 是一个指向字符串的指针,该字符串指示包含已更改的系统参数的区域。该参数通常不指示更改了哪个特定系统参数。 (请注意,某些应用程序发送此消息时 lParam 设置为 NULL。)通常,当您收到此消息时,您应该检查并重新加载应用程序使用的任何系统参数设置。

在 C# 中,使用

PtrToStringAuto()
PtrToStringUni()
lParam
.

访问字符串
© www.soinside.com 2019 - 2024. All rights reserved.