WM_GETTEXT returns 文本以空值分隔

WM_GETTEXT returns text separated with nulls

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")

为什么 returns 字符串用空值分隔?当我只尝试 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"))

代码按照我的意愿工作,但我不确定它是否编写正确

您从 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 字符输入到该编辑控件中,就会产生奇怪的结果(并可能引发异常)。