Я хочу получить значение текстового поля, в которое пользователь вводит текст

.

На данный момент у меня есть код, который выводит то, что написано в элементе, на котором находится фокус клавиатуры. Однако он работает только для текстовой области блокнота, и когда я пытаюсь использовать его в других приложениях, он выводит что-то вроде "Chrome Legacy Window"

.
from ctypes import windll, create_unicode_buffer
import win32gui
import win32con
импортировать время

def getForegroundWindowTitle():
    hWnd = windll.user32.GetForegroundWindow()
    length = windll.user32.GetWindowTextLengthW(hWnd)
    buf = create_unicode_buffer(length + 1)
    windll.user32.GetWindowTextW(hWnd, buf, length + 1)
    
    if buf.value:
        return buf.value
    else:
        return None

time.sleep(3)
windowHandle = win32gui.FindWindow(None, getForegroundWindowTitle())
childwindowHandle = win32gui.FindWindowEx(windowHandle, None, win32gui.GetFocus(), None)
buff = create_unicode_buffer(4096)
win32gui.SendMessage(childwindowHandle, win32con.WM_GETTEXT, 4096, buff) #0x000D
print(buff.value)

Eole_

Ответов: 1

Ответы (1)

Вы можете использовать IUIAutomation::GetFocusedElement для получения текущего элемента UI Automation, имеющего фокус ввода, а затем получить шаблон значения.

Здесь приведен пример для win32 на C++, вы можете свободно конвертировать его в Python:

#include 
#include 
#include 
BOOL main()
{
    HRESULT hr;
    CoInitialize(0);
    Sleep(2000);
    IUIAutomation* pClientUIA;
    hr = CoCreateInstance(CLSID_CUIAutomation, NULL, CLSCTX_INPROC_SERVER, IID_IUIAutomation, reinterpret_cast(&pClientUIA));
    if (S_OK != hr)
    {
        printf("Ошибка CoCreateInstance: %d\n", GetLastError());
        return FALSE;
    }

    IUIAutomationElement* pFocusedElement;
    hr = pClientUIA->GetFocusedElement(&pFocusedElement);
    if (S_OK != hr)
    {
        printf("Ошибка GetFocusedElement: %d\n", GetLastError());
        return FALSE;
    }

    IValueProvider* pValueProvider;
    hr = pFocusedElement->GetCurrentPattern(UIA_ValuePatternId, reinterpret_cast (&pValueProvider));
    if (S_OK != hr)
    {
        printf("Ошибка GetCurrentPattern: %d\n", GetLastError());
        return FALSE;
    }

    BSTR text;
    hr = pValueProvider->get_Value(&text);
    if (S_OK != hr)
    {
        printf("ошибка get_Value: %d\n", GetLastError());
        return FALSE;
    }
    wprintf(L"%s\n", text);
    SysFreeString(text);

    CoUninitialize();
}

Результат:

введите описание изображения здесь

2022 WebDevInsider