У меня проблемы с получением диапазона текста из запущенного экземпляра 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;
}