WM_GETTEXT返回以空值分隔的文本

时间:2017-10-21 15:34:50

标签: python win32gui

import time
import win32gui
import win32con

while True:
    time.sleep(1)
    buf = win32gui.PyMakeBuffer(255)
    window = win32gui.GetForegroundWindow()
    title = win32gui.GetWindowText(window)
    control = win32gui.FindWindowEx(window, 0, 'Edit', None)
    length = win32gui.SendMessage(control, win32con.WM_GETTEXT, 255, buf)
    result = buf[:length]
    print('Title: ', win32gui.GetWindowText(window))
    print(str(buf[:length*2], "UTF_8")

为什么它返回以空值分隔的字符串?当我尝试buff[:length]时,因为那些空值而我的一半字符串

bytearray(b'H\x00e\x00l\x00l\x00o\x00 \x00w\x00o\x00r\x00l\x00d\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x9dL\x03E\x888P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xedL\x03\xa9\xc4\xffb\xa0\tO\x00j\x8c\x1bZ\xa04\xc6\x02IP\x12\x8d\x00\x00\x00\x00\x00\x00\x00\x00\xa0X?\x03\xed`\x05\x89\xa0n\xfb\x02.\x02\xea\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0*X\x00\xf4b\x9c\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x8d\x02\x98?n\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\xcc\x02\xbey\xee\x08\x00\x00\x00\x00\x00\x00\x00')

编辑:

result = buf.tobytes()[:length*2:2]
print(result.decode("UTF-8"))

代码遵循我想要的工作,但我不确定它是否已正确编写

1 个答案:

答案 0 :(得分:1)

您从Win32 API返回的是UTF-16字符串。每个字符都是16位,这就是为什么当它被视为一个字节数组时,每个ascii之间出现一个空字节的原因。

这是解释该字符串的正确方法:

length = win32gui.SendMessage(control, win32con.WM_GETTEXT, 255, buf)
result = buf[0:length*2]
text = result.decode("utf-16")

您的解决方案设法使用utf-8解码,因为您正在跳过所有空字符。这样可以正常工作,但只要在该编辑控件中键入了unicode字符,就会产生奇怪的结果(并可能抛出异常)。