winapi: una forma estándar de recuperar texto del editor de texto en ejecución

Aug 20 2020

¿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 SendMessageusando WM_GETTEXTWM_GETTEXTLENGTHpero solo pude recuperar el texto del título.

Respuestas

2 rustyx Aug 20 2020 at 03:43

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_GETTEXTy WM_GETTEXTLENGTHque 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: