问题描述
我的目标是在用户键入的任何地方显示工具提示。为此,我需要找到插入符号的位置(用户正在键入的位置)。我正在使用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
只能在标准编辑框中获得插入符号。
因此,您可以在记事本,写字板等标准编辑框中插入尖号,如下所示:
现在大多数编辑框不是标准编辑框,而是富文本框。您可以参考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 Controls,Get version of rich edit library