Поиск местоположения каретки в Windows с помощью Python 3

Моя цель - отображать всплывающую подсказку везде, где пользователь печатает. Для этого мне нужно найти расположение курсора (место, где пользователь печатает). Я использую Windows 10 и Python 3.8. Основываясь на этой теме, я попробовал следующий код:

import win32gui
import win32process
import win32api

fg_win = win32gui.GetForegroundWindow()
fg_thread, fg_process = win32process.GetWindowThreadProcessId(fg_win)
current_thread = win32api.GetCurrentThreadId()
win32process.AttachThreadInput(current_thread, fg_thread, True)
try:
    print(win32gui.GetCaretPos())
finally:
    win32process.AttachThreadInput(current_thread, fg_thread, False) #detach

Код печатает 0,0 независимо от того, где на самом деле находится курсор. Как я могу получить расположение курсора на экране?


person Emily Conn    schedule 29.08.2020    source источник
comment
Не существует поддерживаемого способа надежного использования AttachThreadInput из Python. Не большая потеря, так как это все равно не является частью вашего решения. Вместо этого используйте WinEvents.   -  person IInspectable    schedule 29.08.2020


Ответы (1)


Прежде всего, не все курсоры в поле редактирования не могут быть прочитаны. GetCaretPos может получить только знак вставки в стандартном поле редактирования.

Таким образом, вы можете получить курсор в стандартном поле редактирования, таком как блокнот, текстовый блокнот и т. Д., Вот так:

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

И теперь большинство полей редактирования — это не стандартные поля редактирования, а поля форматированного текста. Чтобы узнать, как получить положение курсора в поле форматированного текста, но сообщение используется по-разному в зависимости от версии поля форматированного текста.

Параметры

wParam

Rich Edit 1.0 и 3.0: указатель на структуру POINTL, которая получает координаты клиентской области персонажа. Координаты указаны в единицах экрана и относятся к верхнему левому углу клиентской области элемента управления.

Элементы редактирования и Rich Edit 2.0: индекс символа, начинающийся с нуля.

лпарам

Rich Edit 1.0 и 3.0: индекс символа, начинающийся с нуля.

Элементы редактирования и Rich Edit 2.0: этот параметр не используется.

Возвращаемое значение

Rich Edit 1.0 и 3.0: возвращаемое значение не используется.

Элементы редактирования и Rich Edit 2.0: возвращаемое значение содержит координаты клиентской области персонажа. LOWORD содержит горизонтальную координату, а HIWORD содержит вертикальную координату.

Чтобы получить имя класса, определить версию richedit по имени класса и отправить сообщение.

Дополнительные ссылки:О расширенных элементах управления Edit, Получить версию расширенной библиотеки редактирования

person Song Zhu    schedule 31.08.2020