如何将非托管IntPtr类型转换为ac#string?

我是C#的新手(来自原生C ++背景),我正在尝试编写一个小UI来打印Windows广播消息等等。 我已经在我的C#程序中重写了默认的WndProc消息循环,如下所示:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] protected override void WndProc(ref Message m) { // Listen for operating system broadcasts. switch (m.Msg) { case WM_SETTINGCHANGE: this.richTextLog.Text += "WM_SETTINGCHANGE - lParam=" + m.LParam.ToString() + "\n"; break; } base.WndProc(ref m); } 

我想知道的是,如何获取intPatr类型的lParam对象的字符串表示。 它本质上是C ++领域的一个空白*,我能以某种方式将其转换为C#吗? 据推测,这样做本质上是不安全的。

Marshal.PtrToStringAuto方法(IntPtr)

分配托管String并将存储在非托管内存中的字符串中的所有字符复制到第一个空字符。

上面的答案很棒,它几乎解决了同样的问题,但是……我从方法中得到了看起来像汉字的东西(潆湵瑡氠瑳瑳瑳敮条慥慥慥慥条条条条敭敭敭敭敭敭䌢⸢)。 我必须做的是使用Marshal.PtrToStringAnsi(IntPtr)方法,如下所述: http : //msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx和here: http ://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html 。

一旦我做了更改,我的String再次使用英语。 不知道为什么会这样,但是你去了!