C# Windows消息中的IntPtr到字符串转换

C# Windows消息中的IntPtr到字符串转换,c#,string,interop,marshalling,intptr,C#,String,Interop,Marshalling,Intptr,我把窗户上的留言挂起来惹麻烦了。我需要检测窗口文本(标题)的更改,因此我截获了感兴趣窗口的WM_SETTEXT消息(我这样做是因为在创建窗口时没有指定窗口标题) 在阅读文档的文档时,lParam参数指定一个指向表示窗口文本的字符串的指针 使用SendMessage将消息转发到.NET应用程序。我在.NET应用程序中所做的是: private static bool ProcessMessage(ref Message msg) { ... string s = Marshal.P

我把窗户上的留言挂起来惹麻烦了。我需要检测窗口文本(标题)的更改,因此我截获了感兴趣窗口的WM_SETTEXT消息(我这样做是因为在创建窗口时没有指定窗口标题)

在阅读文档的文档时,lParam参数指定一个指向表示窗口文本的字符串的指针

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

private static bool ProcessMessage(ref Message msg) {
    ...
    string s = Marshal.PtrToStringAuto(msg.LParam) *
}
其中ProcessMessage是处理.NET表单消息的例程

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

在将IntPtr转换为字符串时,我做错了什么


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

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

所以读取IntPtr,读取IntPtr中的值,也就是IntPtr,然后像您所做的那样使用它


可能有效,也可能无效:p

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

所以读取IntPtr,读取IntPtr中的值,也就是IntPtr,然后像您所做的那样使用它


可能有效,也可能无效:p

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

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

Bingo!NET代码正在另一个进程中。我认为众所周知的消息参数可以在进程之间传递。好吧,在另一个进程中只有WM_GETTEXT指针可用。这是一种特殊情况,在内部,该消息是使用内存映射文件实现的。所有其他指针都是无效的。还有,不管窗口是Unicode还是Ansi。宾果!NET代码正在另一个进程中。我认为众所周知的消息参数可以在进程之间传递。好吧,在另一个进程中只有WM_GETTEXT指针可用。这是一种特殊情况,在内部,该消息是使用内存映射文件实现的。所有其他指针都无效。此外,窗口是Unicode还是Ansi也很重要。