通过挂钩窗口消息我遇到了麻烦。我需要检测窗口文本(标题)的变化,所以我拦截了有趣窗口的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消息都被拦截了。
答案 0 :(得分:2)
LParam是一个字符串指针,你的代码是正确的,假设它是在发送WM_SETTEXT消息的同一进程中执行的。在另一个进程中,此指针无效,并且使用此指针的结果未定义。
答案 1 :(得分:-1)
它可能是指向字符指针的指针。
所以读取IntPtr,读取IntPtr中的值也是IntPtr,然后像你一样使用它。
也许它有效,也许它不会:p