C # - Как я могу получить текстовый диапазон из WordPad, отправив сообщение EM_GETTEXTRANGE? - PullRequest
2 голосов
/ 23 февраля 2011

У меня проблемы с получением диапазона текста из запущенного экземпляра WordPad. Я получил следующие сообщения Windows для работы на WordPad без проблем: WM_GETTEXT, WM_GETTEXTLENGTH, EM_REPLACESEL, EM_GETSEL и EM_SETSEL. Мне не повезло с сообщением EM_GETTEXTRANGE.

В моем тестовом приложении C # у меня есть код, который запускается при запуске, который ищет работающий экземпляр WordPad, а затем ищет в своих дочерних окнах окно с именем класса RICHEDIT50W. Это окно, в которое я отправляю сообщения. Опять же, все сообщения, которые я отправил в это окно, работают нормально, за исключением EM_GETTEXTRANGE. После отправки EM_GETTEXTRANGE Marshal.GetLastWin32Error возвращает 5, и MSDN сообщает, что это ERROR_ACCESS_DENIED. Ниже приведен мой код взаимодействия. Может кто-нибудь помочь мне решить проблему? Спасибо!

const uint WM_USER = 0x0400; const uint EM_GETTEXTRANGE = WM_USER + 75;</p> <pre><code>[StructLayout(LayoutKind.Sequential)] struct CharRange { public int min; public int max; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] struct TextRange { public CharRange charRange; [MarshalAs(UnmanagedType.LPWStr)] public string text; } [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] extern static int SendMessage(IntPtr hWnd, uint Msg, int wParam, ref TextRange lParam); public static string GetTextRange(IntPtr wnd, int min, int max) { TextRange textRange = new TextRange(); textRange.charRange.min = min; textRange.charRange.max = max; textRange.text = new string('\0', max - min); int length = SendMessage(wnd, EM_GETTEXTRANGE, 0, ref textRange); int error = Marshal.GetLastWin32Error(); return error == 0 ? textRange.text : string.Empty; }

1 Ответ

2 голосов
/ 24 февраля 2011

Я нашел ответ на свою проблему. При вызове SendMessage, предназначенного для окна в другом процессе, параметры должны быть выделены в памяти целевого процесса для всех сообщений, которые> = WM_USER. Все необходимое может быть сделано путем привязки функций VirtualAllocEx, VirtualFreeEx, ReadProcessMemory и WriteProcessMemory. Он был поднят в другом вопросе на , как использовать EM_GETTEXTRANGE с WriteProcessMemory и ReadProcessMemory , но я изначально не думал, что это применимо к тому, что я делал, потому что я не до конца понимал проблему.

...