win32gui:如何获取窗口的状态栏文本?

Posted

技术标签:

【中文标题】win32gui:如何获取窗口的状态栏文本?【英文标题】:win32gui: how to get the status bar text of a window? 【发布时间】:2015-09-20 14:26:39 【问题描述】:

我想获取一个窗口的状态栏文本!我正在使用win32gui.GetWindowText,但我无法获取状态栏文本。我只是得到标题!如何获取状态栏文本?

#coding=utf-8
import win32gui
# get main window handle

f = win32gui.FindWindow("TMDIForm",None)
print f,win32gui.GetWindowText(f)

#get child window handle of main window
ex=win32gui.FindWindowEx(f,None,"TPanel",None)

#get child window handle of ex window
exx=win32gui.FindWindowEx(ex,None,"TStatusBar",None)

print exx,win32gui.GetWindowText(exx)

【问题讨论】:

您要在哪个应用程序上执行此操作?大多数状态栏包含多个部分。您可能需要调查msctls_statusbar32 状态栏的类是“TStatusBar”,我已经得到状态栏的句柄使用SPY++。但我不能得到文本 【参考方案1】:

以下内容应该有所帮助,您不能在状态栏上使用GetWindowText。一个状态栏通常由多个子项组成。要访问这些使用需要使用SendMessageSB_GETTEXT

#coding=utf-8
import win32gui
import win32api
import win32con

# get main window handle
f = win32gui.FindWindow("TMDIForm",None)
print f,win32gui.GetWindowText(f)

#get child window handle of main window
ex=win32gui.FindWindowEx(f,None,"TPanel",None)

#get child window handle of ex window
exx=win32gui.FindWindowEx(ex,None,"TStatusBar",None)

SB_GETTEXT = win32con.WM_USER + 2
SB_GETTEXTLENGTH = win32con.WM_USER + 3

sub_item = 0

sb_retcode = win32api.SendMessage(exx, SB_GETTEXTLENGTH, sub_item, 0)
sb_type = sb_retcode & 0xFFFF
sb_length = (sb_retcode >> 16) & 0xFFFF

text_buffer = win32gui.PyMakeBuffer(1 + sb_length)
sb_retcode = win32api.SendMessage(exx, SB_GETTEXT, sub_item, text_buffer)

print text_buffer

我无法对此进行测试,因为我找不到合适的窗口。

【讨论】:

【参考方案2】:
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta

如果目标窗口属于当前进程,GetWindowText 会导致将 WM_GETTEXT 消息发送到指定的窗口或控件。如果目标窗口由另一个进程拥有并具有标题,则 GetWindowText 检索窗口标题文本。如果窗口没有标题,则返回值为空字符串。此行为是设计使然。如果拥有目标窗口的进程没有响应,它允许应用程序调用 GetWindowText 而不会变得无响应。但是,如果目标窗口没有响应并且属于调用应用程序,GetWindowText 将导致调用应用程序变得无响应。

要在另一个进程中检索控件的文本,请直接发送 WM_GETTEXT 消息而不是调用 GetWindowText。

    https://www.programcreek.com/python/example/89831/win32gui.GetClassName

https://github.com/certsocietegenerale/fame_modules/blob/fb7a6fb34124fa2ae026719a0f16767cab731c6d/processing/cutthecrap/cutthecrap.py#L66

# hwnd = your TStatusBar or TToolBar or anything
buffer_len = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1
text = array('b', b'\x00\x00' * buffer_len)
text_len = win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buffer_len, text)
text = win32gui.PyGetString(text.buffer_info()[0], buffer_len - 1)

【讨论】:

以上是关于win32gui:如何获取窗口的状态栏文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取每个打开窗口的名称列表?

win32gui 获取窗口内容(internet explorer_server)

如何在按钮单击时从win32 c ++中的文本框获取文本?

c++ win32输出一个文本

如何从 Perl 完全改变 Win32 标题栏的外观?

使用 win32gui 使窗口居中