2010-08-24 44 views
1

我通過掛鉤窗口消息而陷入困境。我需要檢測窗口文本(標題)的變化,所以我攔截WM_SETTEXT消息的有趣窗口(我這樣做是因爲在窗口創建窗口標題沒有指定)。IntPtr在Windows消息中的字符串轉換

閱讀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消息都被攔截。

回答

2

lParam參數是一個字符串指針,你的代碼是正確的,假設它在發送WM_SETTEXT消息的同一過程中執行。在另一個進程中,這個指針是無效的,並且使用這個指針的結果是未定義的。

+0

賓果! .NET代碼在另一個進程中。我在想,衆所周知的消息參數可以在進程之間傳遞。 – Luca 2010-08-24 11:16:08

+0

AFAIK,只有WM_GETTEXT指針在另一個進程中可用。這是特殊情況,內部使用內存映射文件來實現此消息。所有其他指針都是無效的。 – 2010-08-24 11:17:53

+0

還有更多的東西,無論窗口是Unicode還是Ansi,它都很重要。 – 2010-08-24 12:16:15

-1

它可能是一個指向字符指針的指針。

因此,讀取IntPtr,讀取也是IntPtr的IntPtr中的值,然後像那樣使用它。

也許奏效,也許它並不:對

相關問題