gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:42 26 4
gpt4 key购买 nike

我无法从正在运行的写字板实例获取文本范围。我已经获得了以下 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com