| |  | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: TreeView über SendMessage auslesen (3229 mal gelesen)
|
tbd Moderator Teamleiter
  
 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 / zitieren --> Unities abgeben:         
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
  
 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 / zitieren --> Unities abgeben:         
|
BJ Mitglied PLM System Administrator
 
 Beiträge: 488 Registriert: 20.12.2002
|
erstellt am: 11. Mai. 2007 09:42 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
|
tbd Moderator Teamleiter
  
 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 / zitieren --> Unities abgeben:         
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
 
 Beiträge: 488 Registriert: 20.12.2002
|
erstellt am: 11. Mai. 2007 16:35 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |