Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0079: ListBox per API auslesen

 von 

Beschreibung 

Für die eigene Anwendung albern, aber wenn man das Handle einer anderen besitzt läßt sich von dort der Inhalt einer ListBox auslesen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

SendMessageA (SendMessage)

Download:

Download des Beispielprojektes [3,23 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Porject1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Listen-Steuerelement "List2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function SendMessage Lib "user32" Alias _
        "SendMessageA" (ByVal hWnd As Long, ByVal wMsg _
        As Long, ByVal wParam As Long, lParam As Any) _
        As Long

Const LB_GETCOUNT = &H18B
Const LB_GETTEXT = &H189
Const LB_GETTEXTLEN = &H18A
Const LB_GETCURSEL = &H188

Private Sub Form_Load()
  List1.AddItem "Bohnen"
  List1.AddItem "Erbsen"
  List1.AddItem "Möhren"
  List1.AddItem "Mais"
  List1.AddItem "Kartoffeln"
  List1.AddItem "Gurken"
  List1.AddItem "Tomaten"
End Sub

Private Sub Command1_Click()
  Dim lCnt&, X&, L&, Buffer$, Item$, LBidx&
     
    List2.Clear
    lCnt = SendMessage(List1.hWnd, LB_GETCOUNT, 0, 0)
    
    If lCnt > 0 Then
      For X = 0 To lCnt - 1
        List2.AddItem GetListBoxEntry(List1.hWnd, X)
      Next X
    End If
    
    LBidx = SendMessage(List1.hWnd, LB_GETCURSEL, 0, 0)
    If LBidx <> -1 Then
      Text1.Text = GetListBoxEntry(List1.hWnd, LBidx)
    Else
      Text1.Text = ""
    End If
End Sub

Private Function GetListBoxEntry(hWnd&, LbItem&) As String
  Dim L&, Buffer$
  
    L = SendMessage(hWnd, LB_GETTEXTLEN, LbItem, 0)
    Buffer = Space$(L + 1)
    L = SendMessage(hWnd, LB_GETTEXT, LbItem, ByVal Buffer)
    GetListBoxEntry = Left$(Buffer, L)
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Porject1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Kowalski am 07.03.2009 um 22:29

Ich möchte gerne eine Listbox eines fremden Programmes auslesen. Die Anzahl der Zeilen wird zwar noch richtig ermittelt, also stimmt auch das ermittelte Handle. Bei der Ermittlung der Textlänge einer Zeile wird jedoch immer "4" ermittelt. Und beim Auslesen der Textzeile kommen auch nur 4 kryptische Zeichen. Ich habe mal ein bißchen rumgesucht und gefunden, dass es mit den Style der Listbox zu tun hat. Kann man mit irgendwelchen Tricks trotzdem fremde Listboxen auslesen ??

Gruß Kowalski !

Kommentar von DKuyken am 26.07.2005 um 09:18

unter XP wird beim Klick auf den Command Button der Fehler
Methode oer Datenobjekt nicht gefunden erzeugt.

Verwiesen wird auf folgende Zeile:

lCnt = SendMessage(List1.hWnd, LB_GETCOUNT, 0, 0)

Kommentar von Schorsch am 10.03.2004 um 18:47

Das klappt ja für eigene Listen ganz gut, aber ich habe Probleme, andere Listen aus anderen Anwendungen auszulesen. Hat da jemand n Rat??