【问题标题】:Finding the caret location in Windows with Python 3使用 Python 3 在 Windows 中查找插入符号位置
【发布时间】:2020-08-29 01:39:40
【问题描述】:

我的目标是在用户输入的任何位置显示工具提示。为此,我需要找到插入符号的位置(用户输入的位置)。我正在使用 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, fg_thread, False) #detach

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

【问题讨论】:

  • 不支持从 Python 可靠地使用 AttachThreadInput 的方法。损失不大,因为无论如何它都不是您解决方案的一部分。请改用WinEvents

标签: python windows winapi pywin32 win32gui


【解决方案1】:

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

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

而且现在大部分的编辑框都不是标准的编辑框,而是富文本框。您可以参考EM_POSFROMCHAR了解如何获取富文本框中的插入符号位置,但根据富文本框的版本不同,消息的使用方式也不同。

参数

w参数

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

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

l参数

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 2023-03-15
    • 2020-09-05
    • 2014-04-29
    • 2012-02-19
    • 2011-06-05
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多