使用Python 3在Windows中查找插入符位置

问题描述

我的目标是在用户键入的任何地方显示工具提示。为此,我需要找到插入符号的位置(用户正在键入的位置)。我正在使用Windows 10和Python 3.8。基于this thread,我尝试了以下代码

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,False) #detach

无论插入符号实际在哪里,该代码都会打印0,0。如何在屏幕上获取插入符号的位置?

解决方法

首先,不是所有的插入符号都无法读取。 GetCaretPos只能在标准编辑框中获得插入符号。

因此,您可以在记事本,写字板等标准编辑框中插入尖号,如下所示:

enter image description here

现在大多数编辑框不是标准编辑框,而是富文本框。您可以参考EM_POSFROMCHAR来了解如何在富文本框中获得插入符号的位置,但是根据富文本框的版本,消息的使用方式有所不同。

参数

wParam

Rich Edit 1.0和3.0::指向POINTL结构的指针,该结构接收字符的客户区坐标。坐标以屏幕单位为单位,并且相对于控件工作区的左上角。

编辑控件和Rich Edit 2.0:字符的从零开始的索引。

lParam

Rich Edit 1.0和3.0:字符的从零开始的索引。

编辑控件和Rich Edit 2.0::未使用此参数。

返回值

Rich Edit 1.0和3.0::未使用返回值。

编辑控件和Rich Edit 2.0::返回值包含角色的工作区坐标。 LOWORD包含水平坐标,而HIWORD包含垂直坐标。

您可以使用GetClassName获取类名,根据类名区分richedit的版本,然后发送消息。

更多参考文献:About Rich Edit ControlsGet version of rich edit library

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...