Windows消息中的IntPtr To String转换

时间:2010-08-24 10:47:54

标签: c# string interop marshalling intptr

通过挂钩窗口消息我遇到了麻烦。我需要检测窗口文本(标题)的变化,所以我拦截了有趣窗口的WM_SETTEXT消息(我这样做是因为在窗口创建时没有指定窗口标题)。

阅读WM_SETTEXT文档的文档, lParam 参数指定指向表示窗口文本的字符串的指针。

使用SendMessage将消息转发到.NET应用程序。我在.NET应用程序中做的是:

private static bool ProcessMessage(ref Message msg) {
    ...
    string s = Marshal.PtrToStringAuto(msg.LParam) *
}

其中ProcessMessage是.NET表单的例程处理消息。

我总是得到一个空字符串,这不是预期的结果。我尝试了其他Marshal.PtrToString *方法,但没有人工作过。

在将 IntPtr 转换为 String 时,我做错了什么?

(*)请注意,我无法调试此代码,因为它会阻止整个系统,因为所有的Windows消息都被拦截了。

2 个答案:

答案 0 :(得分:2)

LParam是一个字符串指针,你的代码是正确的,假设它是在发送WM_SETTEXT消息的同一进程中执行的。在另一个进程中,此指针无效,并且使用此指针的结果未定义。

答案 1 :(得分:-1)

它可能是指向字符指针的指针。

所以读取IntPtr,读取IntPtr中的值也是IntPtr,然后像你一样使用它。

也许它有效,也许它不会:p