Hot News:

Unser Angebot:

  Foren auf CAD.de
  VBasic / vb.net / vbs / wsh
  TreeView über SendMessage auslesen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
Autor Thema:  TreeView über SendMessage auslesen (3229 mal gelesen)
tbd
Moderator
Teamleiter


Sehen Sie sich das Profil von tbd an!   Senden Sie eine Private Message an tbd  Schreiben Sie einen Gästebucheintrag für tbd

Beiträge: 825
Registriert: 26.01.2006

Dell Percision T5400
Intel(R) Xeon(R) CPU
X5460 @ 3.16GHz
3,25 GB RAM
Nvidia Quadro FX 4600

erstellt am: 09. Mai. 2007 12:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo API-Profis,

ich möchte in VisualBasic 2005 ein TreeView über die Windows API auslesen.
Ziel ist es später das TreeView einer externen Anwendung auszulesen.
Um erstmal auf einen grünen Zweig zu kommen, lesen ich mein eigenes TreeView aus.

Dafür habe ich die ExTreeViewCls erstellt, mit desen Hilfe ich das TreeView auslesen möchte:

Code:

Public Class ExTreeViewCls

    Dim iHwndCls As IntPtr

    Public Sub New(ByVal hWnd As IntPtr)
        iHwndCls = hWnd
    End Sub

    <Runtime.InteropServices.StructLayout( _
    Runtime.InteropServices.LayoutKind.Sequential, Pack:=8, _
    CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Public Structure TVITEM
        Public mask As Integer
        Public hItem As IntPtr
        Public state As Integer
        Public stateMask As Integer
        Public pszText As IntPtr
        Public cchTextMax As Integer
        Public iImage As Integer
        Public iSelectedImage As Integer
        Public cChildren As Integer
        Public lParam As IntPtr
    End Structure

    'Messages
    Public Const TV_FIRST As Integer = 4352
    Public Const TVM_SETIMAGELIST As Integer = TV_FIRST + 9
    Public Const TVM_GETNEXTITEM As Integer = TV_FIRST + 10
    Public Const TVM_GETITEM As Integer = TV_FIRST + 12
    Public Const TVM_SETITEM As Integer = TV_FIRST + 13
    Public Const TVM_HITTEST As Integer = TV_FIRST + 17
    Public Const TVM_SORTCHILDRENCB As Integer = TV_FIRST + 21
    'TVM_GETNEXTITEM wParam
    Public Const TVGN_ROOT As Integer = &H0
    Public Const TVGN_NEXT As Integer = &H1
    Public Const TVGN_CHILD As Integer = &H4
    Public Const TVGN_CARET As Integer = &H9

    <Runtime.InteropServices.DllImport("user32.dll")> _
    Public Overloads Shared Function SendMessage _
        (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    <Runtime.InteropServices.DllImport("User32.dll", _
    CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Public Overloads Shared Function SendMessage _
        (ByVal hWnd As IntPtr, ByVal msg As Integer, _
        ByVal wParam As Integer, ByRef lParam As TVITEM) As Integer
    End Function

    Public Function GetItem(ByRef pItem As TVITEM) As Boolean
        Try
            SendMessage(iHwndCls, TVM_GETITEM, Nothing, pItem)
            Return True
        Catch ex As Exception
            Debug.Assert(False)
            Trace.WriteLine("Fehler: Wo: " & _
                ex.StackTrace & " Was: " & ex.Message)
            Return False
        End Try
    End Function

End Class


Die Klasse wird in meinem Test-Formular, in welchem ein TreeView mit Testinhalt vorhanden ist (Me.TreeView1), iniziallisiert und aufgerufen:

Code:

Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim oExTreeView As ExTreeViewCls
            Dim oItem As ExTreeViewCls.TVITEM
            oExTreeView = New ExTreeViewCls(Me.TreeView1.Handle)
            oExTreeView.GetItem(oItem)
        Catch ex As Exception
            Debug.Assert(False)
            Trace.WriteLine("Fehler: Wo: " & _
                ex.StackTrace & " Was: " & ex.Message)
        End Try
End Sub

Leider bleibt meine TVITEM Struktur immer leer und ich weis nun nicht mehr was ich noch ausprobieren soll. Kann es sein das ich irgendwie in die flasche Richtung denke?

Deshalb die ganz einfache Frage:
Was mache ich falsch?

------------------
Mfg Daniel

Lesen ist super. Nur die Buchstaben machen einen verrückt!
------------------

SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

tbd
Moderator
Teamleiter


Sehen Sie sich das Profil von tbd an!   Senden Sie eine Private Message an tbd  Schreiben Sie einen Gästebucheintrag für tbd

Beiträge: 825
Registriert: 26.01.2006

Dell Percision T5400
Intel(R) Xeon(R) CPU
X5460 @ 3.16GHz
3,25 GB RAM
Nvidia Quadro FX 4600

erstellt am: 11. Mai. 2007 09:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Jungs und Mädels,

es hat geklappt, ich muss es jetzt noch verstehen und etwas optimieren. Aber ich habe den Namen des ersten Eintrags!

Wenn einer Wissen möchte wie es geht, etwas gedulten und bescheid geben!

------------------
Mfg Daniel

Lesen ist super. Nur die Buchstaben machen einen verrückt!
------------------

SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

BJ
Mitglied
PLM System Administrator


Sehen Sie sich das Profil von BJ an!   Senden Sie eine Private Message an BJ  Schreiben Sie einen Gästebucheintrag für BJ

Beiträge: 488
Registriert: 20.12.2002

erstellt am: 11. Mai. 2007 09:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für tbd 10 Unities + Antwort hilfreich

Hallo tbd!

Auf alle Faelle moechte ich das wissen!   

Gruss,
BJ

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

tbd
Moderator
Teamleiter


Sehen Sie sich das Profil von tbd an!   Senden Sie eine Private Message an tbd  Schreiben Sie einen Gästebucheintrag für tbd

Beiträge: 825
Registriert: 26.01.2006

Dell Percision T5400
Intel(R) Xeon(R) CPU
X5460 @ 3.16GHz
3,25 GB RAM
Nvidia Quadro FX 4600

erstellt am: 11. Mai. 2007 09:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo BJ,

ist alles allerdings noch in Arbeit.
Aber das Auslesen des ersten TreeNodes klappt bereits.

Das ganze Funktioniert mit der Klasse ExTreeView. Die Nodes werden durch die Klasse ExTreeNode definiert.

Hier die Hauptklasse ExTreeView:

Code:

Public Class ExTreeView

    Dim iHwndCls As IntPtr
    Dim oExTreeNodeCls As ExTreeNode

    Public Sub New(ByVal hWnd As IntPtr)
        iHwndCls = hWnd
    End Sub

    Private Const TV_FIRST As Integer = 4352
    Private Const TVSIL_NORMAL As Integer = 0
    Private Const TVSIL_STATE As Integer = 2
    Private Const TVM_SETIMAGELIST As Integer = TV_FIRST + 9
    Private Const TVM_GETNEXTITEM As Integer = TV_FIRST + 10
    Private Const TVIF_HANDLE As Integer = 16
    Private Const TVIF_STATE As Integer = 8
    Private Const TVIF_IMAGE As Integer = 2
    Private Const TVIS_STATEIMAGEMASK As Integer = 61440
    Private Const TVM_SETITEM As Integer = TV_FIRST + 13
    Private Const TVGN_ROOT As Integer = 0
    Private Const TVM_GETITEM As Integer = TV_FIRST + 62
    Private Const MY_MAXLVITEMTEXT As Integer = 260
    Private Const TVIF_TEXT As Int32 = &H1

    <Runtime.InteropServices.DllImport("user32.dll")> _
    Private Overloads Shared Function SendMessage _
        (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    <Runtime.InteropServices.DllImport("User32.dll", _
    CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Private Overloads Shared Function SendMessage _
        (ByVal hWnd As IntPtr, ByVal msg As Integer, _
        ByVal wParam As Integer, ByRef lParam As ExTreeNode.TVITEM) As Integer
    End Function

    Private Declare Function LocalAlloc _
        Lib "kernel32.dll" (ByVal wFlags As Int32, ByVal wBytes As Int32) As Int32

    Public Function GetFirstItem() As ExTreeNode
        Try
            Dim oTvItem As New ExTreeNode.TVITEM
            Dim hPszText As IntPtr = IntPtr.Zero
            Dim sItemText As String = Nothing
            Dim hRoot As IntPtr
            Dim oTreeNode As ExTreeNode
            hRoot = IntPtr.op_Explicit( _
                    SendMessage(iHwndCls, _
                    TVM_GETNEXTITEM, TVGN_ROOT, 0))
            oTvItem.hItem = hRoot
            oTvItem.state = 0
            SendMessage(iHwndCls, TVM_GETITEM, 0, oTvItem)
            hPszText = New IntPtr(LocalAlloc(&H40, MY_MAXLVITEMTEXT))
            oTvItem.mask = TVIF_TEXT
            oTvItem.hItem = hRoot
            oTvItem.cchTextMax = MY_MAXLVITEMTEXT
            oTvItem.pszText = hPszText
            SendMessage(iHwndCls, TVM_GETITEM, 0, oTvItem)
            sItemText = Runtime.InteropServices.Marshal.PtrToStringUni( _
                    oTvItem.pszText, MY_MAXLVITEMTEXT)
            oTreeNode = New ExTreeNode
            oTreeNode.Text = sItemText
            oTreeNode.NodeItem = oTvItem
            oExTreeNodeCls = oTreeNode
            Return oTreeNode
        Catch ex As Exception
            Debug.Assert(False)
            Trace.WriteLine("Fehler: Wo: " & _
                ex.StackTrace & " Was: " & ex.Message)
            Return Nothing
        End Try
    End Function

End Class


Die Klasse ExTreeNode für die TreeView Einträge:

Code:

Public Class ExTreeNode

    <Runtime.InteropServices.StructLayout( _
    Runtime.InteropServices.LayoutKind.Sequential, Pack:=8, _
    CharSet:=Runtime.InteropServices.CharSet.Auto)> _
    Public Structure TVITEM
        Dim mask As Integer
        Dim hItem As IntPtr
        Dim state As Integer
        Dim stateMask As Integer
        Dim pszText As IntPtr
        Dim cchTextMax As Integer
        Dim iImage As Integer
        Dim iSelectedImage As Integer
        Dim cChildren As Integer
        Dim lParam As IntPtr
    End Structure

    Dim sText As String
    Dim oTvItem As TVITEM
    Dim oNodes As List(Of ExTreeNode)

    Public Property NodeItem() As TVITEM
        <System.Diagnostics.DebuggerStepThrough()> _
        Get
            Return oTvItem
        End Get
        <System.Diagnostics.DebuggerStepThrough()> _
        Set(ByVal value As TVITEM)
            oTvItem = value
        End Set
    End Property

    Public Property Text() As String
        <System.Diagnostics.DebuggerStepThrough()> _
        Get
            Return sText
        End Get
        <System.Diagnostics.DebuggerStepThrough()> _
        Set(ByVal value As String)
            sText = value
        End Set
    End Property

    Public Property Nodes() As List(Of ExTreeNode)
        Get
            If oNodes Is Nothing Then
                oNodes = New List(Of ExTreeNode)
            End If
            Return oNodes
        End Get
        Set(ByVal value As List(Of ExTreeNode))
            oNodes = value
        End Set
    End Property

End Class


Das ganze wird dann wiefolgt aufgerufen:

Code:

Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim oExTreeView As ExTreeView
            Dim oExTreeNode As ExTreeNode
            oExTreeView = New ExTreeView(Me.TreeView1.Handle)
            oExTreeNode = oExTreeView.GetFirstItem
            MsgBox("Erstes TreeNode: " & oExTreeNode.Text)
        Catch ex As Exception
            Debug.Assert(False)
            Trace.WriteLine("Fehler: Wo: " & _
                ex.StackTrace & " Was: " & ex.Message)
        End Try
End Sub

Und siehe da, man hat den Namen der ersten TreeNodes des externen TreeViews! 

------------------
Mfg Daniel

Lesen ist super. Nur die Buchstaben machen einen verrückt!
------------------

SolidWorks Programmierung | Tools | Makros | Software; Schuler Design Automation GmbH

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

BJ
Mitglied
PLM System Administrator


Sehen Sie sich das Profil von BJ an!   Senden Sie eine Private Message an BJ  Schreiben Sie einen Gästebucheintrag für BJ

Beiträge: 488
Registriert: 20.12.2002

erstellt am: 11. Mai. 2007 16:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für tbd 10 Unities + Antwort hilfreich

Danke!

Werde es mir bei Gelegenheit "reinziehen"! 

Gruss,
BJ

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz