winapi - วิธีมาตรฐานในการดึงข้อความจากการเรียกใช้โปรแกรมแก้ไขข้อความ
Aug 20 2020
มีข้อความมาตรฐานที่สามารถส่งไปยังหน้าต่างแก้ไขข้อความหรือการเรียกใช้WinApiที่จะดึงเนื้อหาของข้อความที่แก้ไขในปัจจุบันหรือไม่
ตัวอย่างเช่นเพื่อดึงเนื้อหาปัจจุบันของหน้าต่างNotepad (สันนิษฐานว่าข้อความล่าสุดยังไม่ได้เขียนลงในไฟล์)
ฉันได้พยายามเรียกข้อความผ่านทางSendMessage
โดยใช้WM_GETTEXT
, WM_GETTEXTLENGTH
แต่ฉันก็สามารถที่จะดึงข้อความชื่อเรื่องเท่านั้น
คำตอบ
2 rustyx Aug 20 2020 at 03:43
โดยทั่วไปไม่มีข้อความมาตรฐานสำหรับสิ่งนี้
แต่Notepadของ Windows มีลูก "แก้ไข" ซึ่งตอบสนองWM_GETTEXT
และWM_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:
