winapi-実行中のテキストエディタからテキストを取得する標準的な方法

Aug 20 2020

現在編集されているテキストの内容を取得する、テキストエディタウィンドウまたは特定のWinApi呼び出しに送信できる標準メッセージはありますか?

たとえば、メモ帳ウィンドウの現在のコンテンツを取得します。(最新のテキストがまだファイルに書き込まれていないと仮定します)

私は経由でテキストを取得しようとしたSendMessage使用してWM_GETTEXT、 WM_GETTEXTLENGTH私はタイトルのみテキストを取得することができました。

回答

2 rustyx Aug 20 2020 at 03:43

一般的にはありません、このための標準的なメッセージはありません。

しかし、Windowsのメモ帳に応答し、 『編集』の子供ありWM_GETTEXTWM_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で動作します: