问题
I'm new to C# (from a native C++ background) and I'm trying to write a little UI to print windows broadcast messages among other things. I've overridden the default WndProc message loop in my C# program like so:
[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);
}
What I'd like to know, is how to obtain a string representation of the lParam object which is of type IntPtr. It's essentially a void* in C++ land, can I cast it inside C# somehow? Presumably doing so is inherently unsafe.
回答1:
Marshal.PtrToStringAuto Method (IntPtr)
Allocates a managed
String
and copies all characters up to the first null character from a string stored in unmanaged memory into it.
回答2:
The above answer was great and it nearly solved the same issue for me but... I got what looks like Chinese characters back from the method (潆湵瑡氠慥瑳漠敮爠灥慥整浩条慮敭›䌢⸢). What I had to do was use the Marshal.PtrToStringAnsi(IntPtr) method as described here: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx and here: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html.
Once I made the change, my String was in English once more. Not sure why that was happening, but there ya go!
来源:https://stackoverflow.com/questions/9175861/how-can-i-convert-an-unmanaged-intptr-type-to-a-c-sharp-string