winapi: un modo standard per recuperare il testo dall'editor di testo in esecuzione

Aug 20 2020

Esiste un messaggio standard che può essere inviato a una finestra di un editor di testo o una determinata chiamata WinApi , che recupererà il contenuto del testo attualmente modificato?

Ad esempio, per recuperare il contenuto corrente di una finestra del Blocco note . (si presume che il testo più aggiornato non sia stato ancora scritto su un file)

Ho provato a recuperare il testo tramite l' SendMessageutilizzo WM_GETTEXTWM_GETTEXTLENGTHma sono riuscito a recuperare solo il testo del titolo.

Risposte

2 rustyx Aug 20 2020 at 03:43

In generale no, non esiste un messaggio standard per questo.

Ma il Blocco note di Windows ha un figlio "Modifica" che risponde ai messaggi WM_GETTEXTe WM_GETTEXTLENGTH- normalmente usati per recuperare il testo dai controlli di input.

Ecco un PoC che dimostra l'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);
}

Funziona su Windows 10: