Как можно получить шрифт wordpad whit python win32 - PullRequest
0 голосов
/ 25 января 2020

Как найти текущее приложение Word Pad со шрифтами Python и win32 gui? Мне удалось найти Windows Хендлер и ребенка windows Пример приложения ниже

import win32gui,win32api,win32con,win32ui

hwnd = win32gui.GetDesktopWindow()
dc = win32gui.GetWindowDC(hwnd)
hfont = win32gui.SendMessage(dc, win32con.WM_GETFONT, 0,0)
fnt_spc = {}
fnt_n = win32ui.CreateFont(fnt_spc)
lf = win32gui.SelectObject(hfont,fnt_n.GetSafeHandle())
print(lf.lfFaceName)

1 Ответ

0 голосов
/ 27 января 2020

Как вы можете видеть в Spy ++, элемент управления в WordPad является Rich Edit: enter image description here

В соответствии с Неподдерживаемая функциональность элемента управления 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

...