Masalah saat mendapatkan konten kotak daftar dengan python dan ctypes di win32

Saya ingin mendapatkan konten kotak daftar berkat python dan ctypes.

item_count = ctypes.windll.user32.SendMessageA(hwnd, win32con.LB_GETCOUNT, 0, 0)
items = []
for i in xrange(item_count):
    text_len = ctypes.windll.user32.SendMessageA(hwnd, win32con.LB_GETTEXTLEN, i, 0)
    buffer = ctypes.create_string_buffer("", text_len+1)
    ctypes.windll.user32.SendMessageA(hwnd, win32con.LB_GETTEXT, i, buffer)
    items.append(buffer.value)
print items

Jumlah itemnya benar tetapi teksnya salah. Semua text_len adalah 4 dan nilai teksnya seperti '0\xd9\xee\x02\x90'

Saya sudah mencoba menggunakan buffer unicode dengan hasil serupa.

Saya tidak menemukan kesalahan saya. Ada ide?


person luc    schedule 23.09.2009    source sumber


Jawaban (2)


Jika kotak daftar yang dimaksud adalah milik pemilik, bagian ini dari Dokumentasi LB_GETTEXT mungkin relevan:

Jika Anda membuat kotak daftar dengan gaya yang dibuat oleh pemilik tetapi tanpa gaya LBS_HASSTRINGS, buffer yang ditunjuk oleh parameter lParam akan menerima nilai yang terkait dengan item (data item).

Empat byte yang Anda terima tentu terlihat seperti sebuah pointer, yang merupakan nilai tipikal untuk disimpan dalam data per item.

person Matthew Xavier    schedule 23.09.2009
comment
Saya pikir kamu benar. Ini adalah kotak daftar yang dibuat oleh pemilik. Saya tidak tahu apa struktur datanya jadi saya tidak bisa mendapatkan teksnya :-( - person luc; 23.09.2009

Sepertinya Anda perlu menggunakan struktur yang dikemas untuk hasilnya. Saya menemukan contoh online, mungkin ini akan membantu Anda:

http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html

# Programmer : Simon Brunning - [email protected]
# Date       : 25 June 2003
def _getMultipleWindowValues(hwnd, getCountMessage, getValueMessage):
    '''A common pattern in the Win32 API is that in order to retrieve a
    series of values, you use one message to get a count of available
    items, and another to retrieve them. This internal utility function
    performs the common processing for this pattern.

    Arguments:
    hwnd                Window handle for the window for which items should be
                        retrieved.
    getCountMessage     Item count message.
    getValueMessage     Value retrieval message.

    Returns:            Retrieved items.'''
    result = []

    VALUE_LENGTH = 256
    bufferlength_int  = struct.pack('i', VALUE_LENGTH) # This is a C style int.

    valuecount = win32gui.SendMessage(hwnd, getCountMessage, 0, 0)
    for itemIndex in range(valuecount):
        valuebuffer = array.array('c',
                                  bufferlength_int +
                                  " " * (VALUE_LENGTH - len(bufferlength_int)))
        valueLength = win32gui.SendMessage(hwnd,
                                           getValueMessage,
                                           itemIndex,
                                           valuebuffer)
        result.append(valuebuffer.tostring()[:valueLength])
    return result

def getListboxItems(hwnd):
    '''Returns the items in a list box control.

    Arguments:
    hwnd            Window handle for the list box.

    Returns:        List box items.

    Usage example:  TODO
    '''

    return _getMultipleWindowValues(hwnd,
                                     getCountMessage=win32con.LB_GETCOUNT,
                                     getValueMessage=win32con.LB_GETTEXT)
person Andre Miller    schedule 23.09.2009