Как вы можете видеть в Spy ++, элемент управления в WordPad является Rich Edit:
В соответствии с Неподдерживаемая функциональность элемента управления Edit : EM_GETCHARFORMAT
следует использовать вместо WM_GETFONT
.
Во-первых, вам нужно получить дескриптор Rich Edit (непосредственно с Spy ++ или WindowFromPoint
, FindWindowEx
, EnumChildWindows
и et c. Но GetDesktopWindow
, который вы использовали, просто вернет дескриптор к окну рабочего стола, а SendMessage
получит дескриптор окна, но не дескриптор контекста устройства)
Кроме того, вам все равно нужно отметить что при отправке сообщения EM_GETCHARFORMAT
в другой процесс вам необходимо запросить часть памяти для чтения и записи структуры CHARFORMAT2
в оконном процессе для взаимодействия с этими двумя процессами.
Пример C ++ (удалите проверку ошибок):
#include <iostream>
#include <windows.h>
#include <Richedit.h>
int main(int argc, char** argv)
{
HWND hwnd = (HWND)0x00090BF0;
DWORD pid = 0;
GetWindowThreadProcessId(hwnd,&pid);
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION| PROCESS_VM_READ | PROCESS_VM_WRITE,false, pid);//7784
CHARFORMAT2 cp;
cp.cbSize = sizeof(CHARFORMAT2);
cp.dwMask = CFM_FACE;
CHARFORMAT2* lf = (CHARFORMAT2*)VirtualAllocEx(hProcess,NULL,sizeof(CHARFORMAT2), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
BOOL ret = WriteProcessMemory(hProcess,lf,&cp, sizeof(CHARFORMAT2),NULL);
//ZeroMemory(&lf,sizeof(lf));
LRESULT lr = SendMessage(hwnd, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)lf);
ret = ReadProcessMemory(hProcess, lf, &cp, sizeof(CHARFORMAT2), NULL);
std::cout << cp.szFaceName << std::endl;
VirtualFreeEx(hProcess,lf, 0, MEM_RELEASE);
return 0;
}
Результат:
Курьер New