私は(ネイティブC++のバックグラウンドから)C#を初めて使用し、Windowsブロードキャストメッセージを印刷するための小さなUIを作成しようとしています。次のように、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);
}
私が知りたいのは、IntPtr型のlParamオブジェクトの文字列表現を取得する方法です。これは本質的にC++ランドではvoid *ですが、どういうわけかC#内にキャストできますか?おそらくそうすることは本質的に危険です。
Marshal.PtrToStringAuto
メソッド(IntPtr)
マネージド
String
を割り当て、アンマネージドメモリに格納されている文字列から最初のヌル文字までのすべての文字をコピーします。
上記の答えは素晴らしく、私にとって同じ問題をほぼ解決しましたが...方法から漢字のように見えるものを取得しました(潆湵瑡氠゚ ー ト敮爠灥漠敮爠灥敮爠灥整整浩条θ›䌢⸢)。私がしなければならなかったことは、ここで説明されているようにMarshal.PtrToStringAnsi(IntPtr)メソッドを使用することでした: http://msdn.Microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx およびここ: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html 。
変更を加えると、文字列はもう一度英語になりました。なぜそれが起こったのかわかりませんが、そこに行きます!