Python:如何从另一个程序窗口获取文本标签?

5
我想使用Python从另一个程序读取文本标签。我认为我必须使用WM_GETTEXT,但我不知道如何使用它,并且在互联网上找不到任何信息。我的程序获取活动窗口,但无法读取文本标签。所以我希望有人能帮助我。
编辑:我已经添加了缓冲区和SendMessage部分。例如,我可以从编辑器中获取文本,但无法从我尝试获取文本标签的程序中获取文本。
我有以下代码,在stackoverflow(Get text from popup window)上找到的:
import win32gui
import time

while True:
    window = win32gui.GetForegroundWindow()
    title = win32gui.GetWindowText(window)
    if 'GLS Exportdatei' in title:
        control = win32gui.FindWindowEx(window, 0, 'static', None)
        buffer = win32gui.PyMakeBuffer(20)
        length = win32gui.SendMessage(control, win32con.WM_GETTEXT, 20, buffer)

        result = buffer[:length]
        print result
        time.sleep(1)

如果您单击要获取文本的窗口(使其成为前台窗口),您的应用程序是否报告正确的值? - Steve Mayne
不,它只显示空白。变量result返回一个空字符串。title变量返回正确的窗口名称。 - Xirama
标题不会超过20个字符,对吧? - Steve Mayne
标题超过20个字符。标题是:“创建GLS导出文件... [RG 100000]”。 - Xirama
我已经为您添加了一个答案。 - Steve Mayne
2个回答

5
如果您窗口的文本超过20个字符,那么您创建的缓冲区太小了。尝试将其扩展到超出您可能需要的范围:
buffer = win32gui.PyMakeBuffer(255)
length = win32gui.SendMessage(control, win32con.WM_GETTEXT, 255, buffer)

如果您想获取主窗口中的控件,请使用EnumChildWindows,并传递父窗口的句柄。您可能需要递归执行此操作。

标题不是问题,我想获取的是文本字段。这是窗口外观的示例:http://imageshack.us/photo/my-images/689/exampleot.png/ 我尝试将这些文本字段存储在结果变量中。 - Xirama
@Xirama,文本是标题还是窗口内容取决于窗口类型。 无论哪种方式,都是相同的调用。 - Mark Ransom
非常感谢您的帮助。我现在使用EnumChildWindows获取控件。 - Xirama

2

win32gui.PyMakeBuffer已经被弃用。此外,buffer是一个内置函数,因此不要将其用作变量名。

相反,只需执行以下操作:

buf = " " * 255
length = win32gui.SendMessage(control, win32con.WM_GETTEXT, 255, buf)
result = buf[:length]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接