2017-10-21 28 views
0
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]试过我有我的字符串的一半,因为是空值WM_GETTEXT返回用空值分隔的文本

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

从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字符,就会生成奇怪的结果(并可能抛出异常)。

+0

使用你的代码中,我得到了以下错误'AttributeError的:“memoryview”对象有没有属性“decode'' 编辑: 我用buf.tobytes()解码(‘UTF-16’)和它的工作原理 – Mat

+0

我正在使用python 3.我怀疑你是在Python 2.很高兴为你工作。 – selbie