2017-10-21 53 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