winapi: una forma estándar de recuperar texto del editor de texto en ejecución
¿Existe un mensaje estándar que se pueda enviar a una ventana del editor de texto o una determinada llamada de WinApi , que recuperará el contenido del texto editado actualmente?
Por ejemplo, para recuperar el contenido actual de una ventana del Bloc de notas . (se supone que el texto más actualizado aún no se ha escrito en un archivo)
Intenté recuperar el texto SendMessage
usando WM_GETTEXT
, WM_GETTEXTLENGTH
pero solo pude recuperar el texto del título.
Respuestas
En general, no hay un mensaje estándar para esto.
Pero el Bloc de notas de Windows tiene un elemento secundario "Editar" que responde a los mensajes WM_GETTEXT
y WM_GETTEXTLENGTH
que normalmente se usan para recuperar texto de los controles de entrada.
Aquí hay una PoC que demuestra la idea:
#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);
}
Funciona en Windows 10:
