【发布时间】:2020-08-19 20:12:58
【问题描述】:
是否有标准的message 可以发送到文本编辑器窗口或某个WinApi 调用,以检索当前编辑文本的内容? p>
例如,检索 记事本 窗口的当前内容。 (假设最新的文本尚未写入文件)
我尝试使用WM_GETTEXT、WM_GETTEXTLENGTH 通过SendMessage 检索文本,但我只能检索到标题文本。
【问题讨论】:
-
使用
WM_GETTEXTLENGTH知道编辑器中有多少个字符,然后分配一个该大小的缓冲区并使用WM_GETTEXT或GetWindowText()用编辑器的实际文本填充它。如果您只想要选定的文本,请稍后使用EM_GETSEL/EM_EXGETSEL确定该文本中选定字符范围的开始/结束索引,然后将这些字符复制到另一个缓冲区。 -
通常您会枚举所有进程 ID,检查进程是否具有所需的名称,例如“记事本.exe”。然后枚举该进程的所有线程。然后使用
EnumThreadWindowsAPI 获取窗口句柄。然后检查窗口类型/类 - 你只需要文本编辑框。最后你可以使用char text[256]; LRESULT result = SendMessage(windowHandle, WM_GETTEXT, sizeof(text), LPARAM(text)); -
WM_GETTEXT可以在某些程序上可靠运行,但更一般地,您希望使用“屏幕阅读器”软件使用的辅助功能 API -
“是否有标准消息” - 一般来说,没有。 “[...] 或某个 WinApi 调用” - 是的,UI Automation.
-
对于任意文本编辑器,没有。您将获得的最接近的是 UI 自动化