1

我通过挂钩窗口消息遇到了麻烦。我需要检测窗口文本(标题)的变化,所以我拦截了有趣窗口的 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 消息都被拦截。

4

2 回答 2

2

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

于 2010-08-24T11:04:29.550 回答
-1

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

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

也许它有效,也许它没有:p

于 2010-08-24T10:59:54.380 回答