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

标签 c# interop pinvoke wordpad

我无法从正在运行的写字板实例获取文本范围。我已经获得了以下 Windows 消息,可以毫无问题地用于写字板:WM_GETTEXT、WM_GETTEXTLENGTH、EM_REPLACESEL、EM_GETSEL 和 EM_SETSEL。不过,我对 EM_GETTEXTRANGE 消息并不满意。

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

构造 WM_USER = 0x0400; const uint EM_GETTEXTRANGE = WM_USER + 75;

[StructLayout(LayoutKind.Sequential)]
结构字符范围
{
  公共(public) int 分钟;
  公共(public) int 最大值;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
结构文本范围
{
  公共(public) CharRange 字符范围;
  [MarshalAs(UnmanagedType.LPWStr)]
  公共(public)字符串文本;
}

[DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
extern static int SendMessage(IntPtr hWnd, uint Msg, int wParam, ref TextRange lParam);

公共(public)静态字符串 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();

  返回错误 == 0 ? textRange.text : string.Empty;
}

最佳答案

我找到了我自己问题的答案。在另一个进程中针对窗口调用 SendMessage 时,必须在目标进程内存中为 >= WM_USER 的所有消息分配参数。所需的一切都可以通过调用函数 VirtualAllocEx、VirtualFreeEx、ReadProcessMemory 和 WriteProcessMemory 来完成。它是在 how to use EM_GETTEXTRANGE with WriteProcessMemory and ReadProcessMemory 的另一个问题中提出的。 , 但我本来不认为这适用于我正在做的事情,因为我没有完全理解这个问题。

关于C# - 如何通过发送 EM_GETTEXTRANGE 消息从写字板获取文本范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094353/

相关文章:

swift - 从具有 uint8_t ** 作为输出参数的 Swift 调用 native 方法

c# - Access 等同于 C# List<T> 的 VBA

c# - C#中如何使用libFLAC读取FLAC标签

c# - 如何使用 Windows shell 获取文件扩展名的大图标?

.net - 仅使用原始类型的 native 互操作的开销

c# - 使用其类型的向下转型实例

c# - 检测资源中 .wav 文件的持续时间

c# - 具有空安全性的 Web API 空列表

c# - 在 Node.js/服务器端 javascript 中使用 .NET DLL

c# - 从 C# 调用 C++ 函数 - 结构体、指针、函数指针