C++ winapi-从运行的文本编辑器中检索文本的标准方法

C++ winapi-从运行的文本编辑器中检索文本的标准方法,c++,windows,winapi,C++,Windows,Winapi,是否有标准消息可以发送到文本编辑器窗口或某个WinApi调用,以检索当前编辑文本的内容 例如,检索记事本窗口的当前内容。(假设最新文本尚未写入文件) 我曾尝试使用WM_GETTEXT,WM_GETTEXTLENGTH通过SendMessage检索文本,但我只能检索标题文本。一般来说没有这方面的标准消息 但是Windows的记事本有一个“编辑”子项,它响应通常用于从输入控件检索文本的消息 下面是一个PoC演示了这个想法: #include <iostream> #include <

是否有标准消息可以发送到文本编辑器窗口或某个WinApi调用,以检索当前编辑文本的内容

例如,检索记事本窗口的当前内容。(假设最新文本尚未写入文件)


我曾尝试使用
WM_GETTEXT
WM_GETTEXTLENGTH
通过
SendMessage
检索文本,但我只能检索标题文本。

一般来说没有这方面的标准消息

但是Windows的记事本有一个“编辑”子项,它响应通常用于从输入控件检索文本的消息

下面是一个PoC演示了这个想法:

#include <iostream>
#include <vector>
#include <string.h>
#include <Windows.h>

BOOL CALLBACK enumProc(HWND hwnd, LPARAM) {
    std::vector<char> buf(100);
    GetClassNameA(hwnd, buf.data(), 100);
    if (strcmp(buf.data(), "Notepad")) return TRUE;
    hwnd = FindWindowEx(hwnd, NULL, "Edit", NULL);
    if (!hwnd) return TRUE;
    int textLength = SendMessageA(hwnd, WM_GETTEXTLENGTH, 0, 0) + 1;
    if (textLength <= 0) return TRUE;
    buf.resize(textLength);
    SendMessage(hwnd, WM_GETTEXT, textLength, (LPARAM)buf.data());
    std::cout << buf.data() << "\n";
    return TRUE;
}

int main() {
    EnumWindows(&enumProc, 0);
}
#包括
#包括
#包括
#包括
BOOL回调enumProc(HWND-HWND,LPARAM){
std::载体buf(100);
GetClassNameA(hwnd,buf.data(),100);
if(strcmp(buf.data(),“Notepad”))返回TRUE;
hwnd=FindWindowEx(hwnd,NULL,“编辑”,NULL);
如果(!hwnd)返回TRUE;
int textLength=SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0)+1;

如果(textLength)使用
WM_GETTEXTLENGTH
知道编辑器中有多少个字符,则分配该大小的缓冲区并使用
WM_GETTEXT
GetWindowText()
用编辑器的实际文本填充它。如果您只是想要所选文本,请在之后使用
EM_GETSEL
/
EM_EXGETSEL
确定该文本中所选字符范围的开始/结束索引,然后将这些字符复制到另一个缓冲区。通常,您会枚举所有进程ID,检查进程ess具有所需的名称,例如“notepad.exe”。然后枚举此进程的所有线程。然后使用
EnumThreadWindows
API获取windows句柄。然后检查窗口类型/类-您只需要文本编辑框。最后,您可以使用
char text[256];LRESULT result=SendMessage(windowHandle、WM_GETTEXT、sizeof(text)、LPRAM(text))
WM_GETTEXT
将在某些程序上可靠地工作,但更一般地说,您希望使用“屏幕阅读器”软件使用的辅助功能API“是否存在标准消息”-一般来说,不是“[…]或某个WinApi调用”-是的,。对于任意文本编辑器,不是。您将获得的最接近的界面是您尝试使用WM_GETTEXT的UI-它不只是返回窗口标题吗?您需要获得“编辑”child-看我的代码,它是有效的。任何比记事本更高级的东西都不会使用编辑控件,所以我想知道这个答案到底有多有用。@JonathanPotter答案中的第一句话说没有标准的方法来检索文本,这是(不幸的)一个有效的答案。有一个标准的方法。它是UI自动化。但不是每个程序都支持它。