Problème Lors de l'obtention du contenu d'une liste de list avec Python et CTYPES sur Win32

StackOverflow https://stackoverflow.com/questions/1466453

  •  13-09-2019
  •  | 
  •  

Question

Je voudrais obtenir le contenu d'une zone de liste grâce à Python et 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

Le nombre d'éléments est correct mais le texte est faux. Tous les text_len sont 4 et les valeurs de texte sont quelque chose comme '0 xd9 xee x02 x90'

J'ai essayé d'utiliser un tampon Unicode avec un résultat similaire.

Je ne trouve pas mon erreur. Une idée?

Était-ce utile?

La solution

Si la zone de liste en question est tirée par le propriétaire, ce passage du Lb_getText La documentation peut être pertinente:

Si vous créez la zone de liste avec un style dessiné propriétaire, mais sans le style LBS_HASSTRINGS, le tampon pointé par le paramètre LPARAM recevra la valeur associée à l'élément (les données de l'élément).

Les quatre octets que vous avez reçus semblent certainement être un pointeur, qui est une valeur typique à stocker dans les données par éléments.

Autres conseils

Il semble que vous deviez utiliser une structure emballée pour le résultat. J'ai trouvé un exemple en ligne, cela vous aidera peut-être:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top