Преобразование IntPtr в строку в сообщениях Windows - PullRequest
1 голос
/ 24 августа 2010

У меня проблемы с перехватом оконных сообщений. Мне нужно обнаружить изменения текста (заголовка) окна, поэтому я перехватываю сообщение WM_SETTEXT для интересных окон (я делаю это потому, что при создании окна заголовок окна не указывается).

При чтении документации WM_SETTEXT документации, параметр lParam указывает указатель на строку, представляющую текст окна.

Сообщение пересылается в приложение .NET с помощью SendMessage. Что я делаю в приложении .NET:

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

где ProcessMessage - процедура обработки сообщений в форме .NET.

Я всегда получаю пустую строку, которая не является ожидаемым результатом. Я пробовал другие методы Marshal.PtrToString *, но никто не работал.

Что я делаю не так при преобразовании IntPtr в String ?

(*) Обратите внимание, что я не могу отладить этот код, поскольку он заблокирует всю систему, поскольку все сообщения Windows перехватываются.

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

LParam является строковым указателем, и ваш код верен, при условии, что он выполняется в том же процессе, где было отправлено сообщение WM_SETTEXT.В другом процессе этот указатель недействителен, и результат использования этого указателя не определен.

0 голосов
/ 24 августа 2010

Это, вероятно, указатель на указатель символов.

Итак, прочитайте IntPtr, прочитайте значение в IntPtr, которое также является IntPtr, а затем используйте это, как вы.

Может быть, это работает, а может и нет: p

...