winapi - стандартный способ получить текст из запущенного текстового редактора
Есть ли стандартное сообщение, которое можно отправить в окно текстового редактора или определенный вызов WinApi , который будет извлекать содержимое редактируемого в данный момент текста?
Например, чтобы получить текущее содержимое окна Блокнота . (предполагается, что самый последний текст еще не был записан в файл)
Я пытался получить текст с помощью SendMessage
using WM_GETTEXT
, WM_GETTEXTLENGTH
но мне удалось получить только текст заголовка.
Ответы
В общем ни в нет стандартного сообщения для этого.
Но в Блокноте Windows есть дочерний элемент «Edit», который отвечает на сообщения WM_GETTEXT
и WM_GETTEXTLENGTH
-, обычно используемые для извлечения текста из элементов управления вводом.
Вот 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);
}
Работает в Windows 10:
