2017-10-21 29 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") 

なぜNULLで区切られた文字列を返しますか?私はちょうど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") 

あなたのソリューションを使用すると、すべてのNULL文字をスキップしているので、UTF-8のデコードで動作するように管理しています。それは正常に動作しますが、ユニコード文字がそのエディットコントロールに入力されるとすぐに、奇妙な結果が生成されます(場合によっては例外がスローされます)。

+0

私はエラー 'はAttributeError以下の持っているあなたのコード使用: 'memoryview' オブジェクトが 編集decode''」は属性を持っていません:。)私は(buf.tobytesを使用 を( "UTF-16")をデコードし、それが動作します – Mat

+0

私はPython 3を使用していました。あなたはPython 2上にいると思われます。 – selbie