winapi-실행중인 텍스트 편집기에서 텍스트를 검색하는 표준 방법

Aug 20 2020

현재 편집 된 텍스트의 내용을 검색 하는 텍스트 편집기 창이나 특정 WinApi 호출 로 보낼 수 있는 표준 메시지 가 있습니까?

예를 들어, 메모장 창의 현재 내용을 검색합니다 . (최신 텍스트가 아직 파일에 기록되지 않았다고 가정)

나는 통해 텍스트를 검색 해봤 SendMessage사용 WM_GETTEXTWM_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에서 작동 :