C#-如何通过发送EM_getextrange消息从写字板获取文本范围?

C#-如何通过发送EM_getextrange消息从写字板获取文本范围?,c#,interop,pinvoke,wordpad,C#,Interop,Pinvoke,Wordpad,我无法从正在运行的写字板实例中获取文本范围。我已经获得了以下Windows消息,可以在WordPad上正常工作:WM_GETTEXT、WM_GETTEXTLENGTH、EM_REPLACESEL、EM_GETSEL和EM_SETSEL。不过,我对EM_GETTEXTRANGE的消息一点运气都没有 在我的C#test应用程序中,我有一些在启动时运行的代码,它会查找正在运行的写字板实例,然后在它的子窗口中搜索类名为RICHEDIT50W的窗口。这是我向其发送消息的窗口。同样,我在这个窗口发送的所有消

我无法从正在运行的写字板实例中获取文本范围。我已经获得了以下Windows消息,可以在WordPad上正常工作:WM_GETTEXT、WM_GETTEXTLENGTH、EM_REPLACESEL、EM_GETSEL和EM_SETSEL。不过,我对EM_GETTEXTRANGE的消息一点运气都没有

在我的C#test应用程序中,我有一些在启动时运行的代码,它会查找正在运行的写字板实例,然后在它的子窗口中搜索类名为RICHEDIT50W的窗口。这是我向其发送消息的窗口。同样,我在这个窗口发送的所有消息都可以正常工作,除了emu getextrange。在发送EM_getExtange后,Marshal.GetLastWin32Error返回5,MSDN称其为ERROR_ACCESS_DENIED。下面是我的一些互操作代码。有人能帮我解决这个问题吗?谢谢


consuint WM_USER=0x0400;
consuint EM_getextrange=WM_USER+75

[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;
}

我找到了自己问题的答案。当调用SendMessage以另一进程中的窗口为目标时,必须在目标进程内存中为>=WM\U用户的所有消息分配参数。所需的一切都可以通过pinvoking函数VirtualAllocEx、VirtualFreeEx、ReadProcessMemory和WriteProcessMemory来完成。这是在会议上的另一个问题中提出的,但我最初认为这不适用于我正在做的事情,因为我没有完全理解这个问题