Frage

Ich möchte den Inhalt eines Listenfelds dank Python und CTypes erhalten.

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

Die Anzahl der Elemente ist korrekt, aber der Text ist falsch. Alle text_len sind 4 und die Textwerte sind so etwas wie '0 xd9 xee x02 x90' '

Ich habe versucht, einen Unicode -Puffer mit einem ähnlichen Ergebnis zu verwenden.

Ich finde meinen Fehler nicht. Irgendeine Idee?

War es hilfreich?

Lösung

Wenn das fragliche Listenfeld Eigentümer gezeichnet ist, ist diese Passage aus der LB_GETTEXT Dokumentation kann relevant sein:

Wenn Sie das Listenfeld mit einem im Eigentümer gezeichneten Stil erstellen, jedoch ohne den LBS_HASStrings-Stil, wird der Puffer, auf den der LPARAM-Parameter zeigt, den dem Element zugeordneten Wert (die Elementdaten).

Die vier Bytes, die Sie erhalten haben, sehen sicherlich so aus, als ob sie ein Zeiger sind, was ein typischer Wert ist, um in den Daten zu speichern.

Andere Tipps

Es sieht so aus, als müssten Sie eine gepackte Struktur für das Ergebnis verwenden. Ich habe online ein Beispiel gefunden, vielleicht hilft Ihnen dies:

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

# Programmer : Simon Brunning - simon@brunningonline.net
# 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top