purebasic.info

PureBasic forum
Текущее время: Пт июл 10, 2020 9:44 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Прочитать чужой SysTreeView32
СообщениеДобавлено: Чт мар 19, 2020 3:35 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 426
Благодарил (а): 8 раз.
Поблагодарили: 18 раз.
Пункты репутации: 0
Прочитать чужой SysTreeView32, и построить правильно чужое дерево в своем окне.
Тестовый пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
  If OpenWindow(5, 0, 0, 170, 170, "TreeGadgetTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TreeGadget(0, 5, 5, 160, 160)                                         ; TreeGadget standard
   
        AddGadgetItem (0, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
        AddGadgetItem (0, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
        AddGadgetItem(0, -1, "Sub-Item 1", 0, 1)    ; These are on the 1st sublevel
        AddGadgetItem(0, -1, "Sub-Item 2", 0, 1)
        AddGadgetItem(0, -1, "Sub-Item 3", 0, 1)
        AddGadgetItem(0, -1, "Sub-Item 4", 0, 1)
        AddGadgetItem (0, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
 
    Repeat  :  Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


Сама программа:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Global ventTreeHWND
 
Procedure EnumCallback1(hwnd, Value)
  ClassName$ = Space(256)
  GetClassName_(hwnd, @ClassName$, 256)
 
  If ClassName$ = "SysTreeView32"
    ventTreeHWND = hwnd
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure
 
Procedure.l GetItemID(Gadget.l, item.l)
  Protected hItem.l, hItem2.l
  hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
  For i.l = 0 To item-1
    hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    Repeat
      If hItem2 = #Null
        hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
      EndIf
      If hItem2 = #Null
        hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
      EndIf
    Until hItem2 <> #Null
    hItem = hItem2
  Next i
  ProcedureReturn hItem
EndProcedure
 
Procedure EnumTreeItems(parent, hwndTreeView)
  ;--- Open tree process
  pid.l = 0
  GetWindowThreadProcessId_(parent, @pid)
  If pid
    result + 1
    tvPrc.l = 0
    tvPrc.l = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE, #False, pid)
    If tvPrc
      result + 1
      ;--- Creat buffer to hold result for reading tree info
      buffSize = SizeOf(TV_ITEM) + 512
      *Buff1 = VirtualAllocEx_(tvPrc, 0, buffSize, #MEM_COMMIT,  #PAGE_READWRITE)
      If *Buff1
        result + 1
      EndIf
    EndIf
  EndIf
 
  ;--- Write tvi\dwMask TBBUTTONINFO to taskbar
  tvi.TV_ITEM
  tvi\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_SELECTEDIMAGE
   tvi\pszText = *Buff1 + SizeOf(TV_ITEM)
  tvi\cchTextMax = 260
  ;--- Loop through all tree items
  If *Buff1
    itemCount = SendMessage_(hwndTreeView, #TVM_GETCOUNT, 0, 0)-1
    For i = 0 To itemCount
      tvi\hItem = GetItemID(hwndTreeView, i)
      WriteProcessMemory_(tvPrc, *Buff1, @tvi, buffSize, @result)
      ;--- Get the tree item info
      SendMessage_(hwndTreeView, #TVM_GETITEM, i, *Buff1)        
      ;- get the item image info
      ReadProcessMemory_(tvPrc, *Buff1, @tvi, SizeOf(tvi), @result)
      itemText.s = Space(260)
      ;- Get the item text
      ReadProcessMemory_(tvPrc, tvi\pszText, @itemText, 260, @result)
        ;- ПРОБЛЕМА
     
      AddGadgetItem(0, tvi\lParam, itemText, 0, 0)    
    Next i
    VirtualFreeEx_(tvPrc, *Buff1, 0, #MEM_RELEASE)
    CloseHandle_(tvPrc)
  EndIf
EndProcedure
 
If OpenWindow(0, 0, 0, 200, 200, "Test by Sparkie",  #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
  TreeGadget(0, 5, 5, 190, 190)
 
  ventText.s = Space(255)
  VentriloHWND = FindWindow_(0, "TreeGadgetTest")
  ventTextLen = GetWindowText_(VentriloHWND, @ventText, 255)
  EnumChildWindows_(VentriloHWND, @EnumCallback1(), 0)
   
  If VentriloHWND And ventTreeHWND
    EnumTreeItems(VentriloHWND, ventTreeHWND)
  Else
    MessageRequester("Error", "Ventrilo not found", #PB_MessageRequester_Ok | #MB_ICONERROR)
    End
  EndIf
 
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Пт мар 20, 2020 7:45 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 649
Благодарил (а): 45 раз.
Поблагодарили: 81 раз.
Пункты репутации: 2
У вас конечно не дерево получилось а список. Это отсюда код?

Я на AutoIt3 делал 2 программы захвата дерева и формирования дерева. Это Create_list_files и CaptureText, причём в первой проге я хотел сделать алгоритм, чтобы формировала как вторая прога и читала, но не получилось. То есть первая выдаёт список путей от корня, а вторая что то типа форматированного списка

CaptureText выдаёт форматированный список
Цитата:
-----Normal Item 0
+----Node 0
| -----Sub-Item 1
| -----Sub-Item 2
| -----Sub-Item 3
| -----Sub-Item 4
-----File 0



Create_list_files выдаёт список путей, но его я формировал в дерево без проблем.
Цитата:
Normal Item 0
Node 0\Sub-Item 1
Node 0\Sub-Item 2
Node 0\Sub-Item 3
Node 0\Sub-Item 4
File 0

Я хотел структурированный, так как он легко воспринимается, но мне не удалось преобразовать его в дерево. А тот который путями - удалось.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Пт мар 20, 2020 9:27 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 426
Благодарил (а): 8 раз.
Поблагодарили: 18 раз.
Пункты репутации: 0
AZJIO писал(а):
Это отсюда код?

Да.
формирования дерева для чужого приложения не приведешь на PureBasic?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Сб мар 21, 2020 5:30 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 649
Благодарил (а): 45 раз.
Поблагодарили: 81 раз.
Пункты репутации: 2
@ZOLO@ писал(а):
формирования дерева для чужого приложения не приведешь на PureBasic?
В виде текста или в виде элемента SysTreeView32 с заполнением пунктов?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Сб мар 21, 2020 1:58 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1025
Благодарил (а): 2 раз.
Поблагодарили: 59 раз.
Пункты репутации: 9
Гаджетов по количеству ещё нужно учесть,ведь их может быть не один. :wink:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
Global i1.i
Global Dim hwndchild.i(10000)
 
Procedure.i enumfunczuy1(HWND.i,lp.i)
    ;Static i1.i
  If i1<10000 And HWND<>0
     hwndchild(i1)=HWND
     i1+1
   ProcedureReturn #True
 Else
   hwndchild(i1)=0
     i1=0
   ProcedureReturn #False
  EndIf
EndProcedure
Procedure.s RealGetWindowClass(HWNDClassa.i,ClassName.s="                              ")
  RealGetWindowClass_(HWNDClassa,@ClassName,25)
  ProcedureReturn ClassName
EndProcedure
 
Procedure.l GetItemID(Gadget.l, item.l)
  Protected hItem.l, hItem2.l
  hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
  For i.l = 0 To item-1
    hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    Repeat
      If hItem2 = #Null
        hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
      EndIf
      If hItem2 = #Null
        hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
      EndIf
    Until hItem2 <> #Null
    hItem = hItem2
  Next i
  ProcedureReturn hItem
EndProcedure
 
Procedure EnumTreeItems(parent, hwndTreeView)
  ;--- Open tree process
  pid.l = 0
  GetWindowThreadProcessId_(parent, @pid)
  If pid
    result + 1
    tvPrc.l = 0
    tvPrc.l = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE, #False, pid)
    If tvPrc
      result + 1
      ;--- Creat buffer to hold result for reading tree info
      buffSize = SizeOf(TV_ITEM) + 512
      *Buff1 = VirtualAllocEx_(tvPrc, 0, buffSize, #MEM_COMMIT,  #PAGE_READWRITE)
      If *Buff1
        result + 1
      EndIf
    EndIf
  EndIf
 
  ;--- Write tvi\dwMask TBBUTTONINFO to taskbar
  tvi.TV_ITEM
  tvi\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_SELECTEDIMAGE
   tvi\pszText = *Buff1 + SizeOf(TV_ITEM)
  tvi\cchTextMax = 260
  ;--- Loop through all tree items
  If *Buff1
    itemCount = SendMessage_(hwndTreeView, #TVM_GETCOUNT, 0, 0)-1
    For i = 0 To itemCount
      tvi\hItem = GetItemID(hwndTreeView, i)
      WriteProcessMemory_(tvPrc, *Buff1, @tvi, buffSize, @result)
      ;--- Get the tree item info
      SendMessage_(hwndTreeView, #TVM_GETITEM, i, *Buff1)        
      ;- get the item image info
      ReadProcessMemory_(tvPrc, *Buff1, @tvi, SizeOf(tvi), @result)
      itemText.s = Space(260)
      ;- Get the item text
      ReadProcessMemory_(tvPrc, tvi\pszText, @itemText, 260, @result)
        ;- ПРОБЛЕМА
     
      AddGadgetItem(0, tvi\lParam, itemText, 0, 0)    
    Next i
    VirtualFreeEx_(tvPrc, *Buff1, 0, #MEM_RELEASE)
    CloseHandle_(tvPrc)
  EndIf
EndProcedure
 
 
 
 
If OpenWindow(0, 0, 0, 500, 500, "Test by Sparkie",  #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
 
  VentriloHWND = 197090;FindWindow_(0, "TreeGadgetTest")
 If VentriloHWND<>0
    PanelGadget(100,0,0,500,500)
  EnumChildWindows_(VentriloHWND, @enumfunczuy1(),0)
   For i=0 To 10000
     If hwndchild(i)<>0
        If RealGetWindowClass(hwndchild(i))="SysTreeView32"
         AddGadgetItem(100, -1, Str(GetWindowLongPtr_(hwndchild(i),#GWLP_ID))+" TreeGadget "+Str(hwndchild(i)))
         TreeGadget(i, 5, 5,480,460)
           ventText.s = Space(255)
           ventTextLen = GetWindowText_(hwndchild(i), @ventText, 255)
           EnumTreeItems(VentriloHWND,hwndchild(i))
         EndIf
     Else  
       Break
     EndIf  
   Next  
 EndIf
   
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
End
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Сб мар 21, 2020 4:14 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 426
Благодарил (а): 8 раз.
Поблагодарили: 18 раз.
Пункты репутации: 0
AZJIO писал(а):
в виде элемента SysTreeView32 с заполнением пунктов?

вот так https://cloud.mail.ru/public/5d6Y/5i69htvWK


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Сб мар 21, 2020 9:35 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 1025
Благодарил (а): 2 раз.
Поблагодарили: 59 раз.
Пункты репутации: 9
на хабре вычитал про дупликат процесса может понадобится? :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
Global i1.i
Global Dim hwndchild.i(10000)
 
Procedure.i enumfunczuy1(HWND.i,lp.i)
    ;Static i1.i
  If i1<10000 And HWND<>0
     hwndchild(i1)=HWND
     i1+1
   ProcedureReturn #True
 Else
   hwndchild(i1)=0
     i1=0
   ProcedureReturn #False
  EndIf
EndProcedure
Procedure.s RealGetWindowClass(HWNDClassa.i,ClassName.s="                              ")
  RealGetWindowClass_(HWNDClassa,@ClassName,25)
  ProcedureReturn ClassName
EndProcedure
 
Procedure.l GetItemID(Gadget.l, item.l)
  Protected hItem.l, hItem2.l
  hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
  For i.l = 0 To item-1
    hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    Repeat
      If hItem2 = #Null
        hItem2 = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
      EndIf
      If hItem2 = #Null
        hItem = SendMessage_(Gadget, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem)
      EndIf
    Until hItem2 <> #Null
    hItem = hItem2
  Next i
  ProcedureReturn hItem
EndProcedure
 
Procedure EnumTreeItems(parent, hwndTreeView)
  ;--- Open tree process
  pid.l = 0
  GetWindowThreadProcessId_(parent, @pid)
  If pid
    ;result + 1
    tvPrc.l = 0
    tvPrc.l =OpenProcess_(#PROCESS_DUP_HANDLE|#PROCESS_QUERY_INFORMATION |#PROCESS_VM_OPERATION | #PROCESS_VM_READ| #PROCESS_VM_WRITE, #False,pid)
 
   Protected  ProcessAllAccessHandle.l
    If tvPrc
       ;получаем второй описатель на тот же процесс, но уже с максимально широкими правами:
       DuplicateHandle_(tvPrc,GetCurrentProcess_(),GetCurrentProcess_(),@ProcessAllAccessHandle,0,#False,#DUPLICATE_SAME_ACCESS)
       CloseHandle_(tvPrc)
       tvPrc=ProcessAllAccessHandle
       
      ;result + 1
      ;--- Creat buffer to hold result for reading tree info
      buffSize = SizeOf(TV_ITEM) + 512
      *Buff1 = VirtualAllocEx_(tvPrc, 0, buffSize, #MEM_COMMIT,  #PAGE_READWRITE)
      If *Buff1
        ;result + 1
      EndIf
     Else
       Debug "Ohibka otcrytiy processa  "+Str(GetLastError_())
    EndIf
   
  EndIf
 
  ;--- Write tvi\dwMask TBBUTTONINFO to taskbar
  tvi.TV_ITEM
  tvi\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_SELECTEDIMAGE
   tvi\pszText = *Buff1 + SizeOf(TV_ITEM)
  tvi\cchTextMax = 260
  ;--- Loop through all tree items
  If *Buff1
    itemCount = SendMessage_(hwndTreeView, #TVM_GETCOUNT, 0, 0)-1
    For i = 0 To itemCount
      tvi\hItem = GetItemID(hwndTreeView, i)
      WriteProcessMemory_(tvPrc, *Buff1, @tvi, buffSize, @result)
      ;--- Get the tree item info
      SendMessage_(hwndTreeView, #TVM_GETITEM, i, *Buff1)        
      ;- get the item image info
      ReadProcessMemory_(tvPrc, *Buff1, @tvi, SizeOf(tvi), @result)
      itemText.s = Space(260)
      ;- Get the item text
      ReadProcessMemory_(tvPrc, tvi\pszText, @itemText, 260, @result)
        ;- ПРОБЛЕМА
     
      AddGadgetItem(0, tvi\lParam, itemText, 0, 0)    
    Next i
    VirtualFreeEx_(tvPrc, *Buff1, 0, #MEM_RELEASE)
    CloseHandle_(tvPrc)
  EndIf
EndProcedure
 
 
 
 
If OpenWindow(0, 0, 0, 500, 500, "Test by Sparkie",  #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
 
  VentriloHWND = FindWindow_(0, "TreeGadgetTest")
 If VentriloHWND<>0
    PanelGadget(100,0,0,500,500)
  EnumChildWindows_(VentriloHWND, @enumfunczuy1(),0)
   For i=0 To 10000
     If hwndchild(i)<>0
        If RealGetWindowClass(hwndchild(i))="SysTreeView32"
         AddGadgetItem(100, -1, Str(GetWindowLongPtr_(hwndchild(i),#GWLP_ID))+" TreeGadget "+Str(hwndchild(i)))
         TreeGadget(i, 5, 5,480,460)
           ventText.s = Space(255)
           ventTextLen = GetWindowText_(hwndchild(i), @ventText, 255)
           EnumTreeItems(VentriloHWND,hwndchild(i))
         EndIf
     Else  
       Break
     EndIf  
   Next  
 EndIf
   
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
End
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Вт мар 24, 2020 3:43 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 426
Благодарил (а): 8 раз.
Поблагодарили: 18 раз.
Пункты репутации: 0
Решил
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Global ventTreeHWND
 
Structure ListDataTree
  Hendel.l
  Numer.l  
EndStructure
 
Procedure EnumCallback(hwnd, Value)
  ClassName$ = Space(256)
  GetClassName_(hwnd, @ClassName$, 256)
 
  If ClassName$ = "SysTreeView32"
    ventTreeHWND = hwnd
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure
 
Procedure TreeViem(hwndTreeView, hItem, iSaveItem, List LDTree.ListDataTree())
  hItem1 = SendMessage_(hwndTreeView, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)      
  While hItem1  
    hItem2 = SendMessage_(hwndTreeView, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
    AddElement(LDTree()) : LDTree()\Hendel = hItem1 : LDTree()\Numer = iSaveItem+1
    If hItem2 <> 0
      TreeViem(hwndTreeView, hItem1, iSaveItem+1, LDTree())
    EndIf  
    hItem1 = SendMessage_(hwndTreeView, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem1)
  Wend
EndProcedure
 
Procedure EnumTreeItems(parent, hwndTreeView)
  ;--- Open tree process
  pid.l = 0
  GetWindowThreadProcessId_(parent, @pid)
  If pid
    result + 1
    tvPrc.l = 0
    tvPrc.l = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE, #False, pid)
    If tvPrc
      result + 1
      ;--- Creat buffer to hold result for reading tree info
      buffSize = SizeOf(TV_ITEM) + 512
      *Buff1 = VirtualAllocEx_(tvPrc, 0, buffSize, #MEM_COMMIT,  #PAGE_READWRITE)
      If *Buff1
        result + 1
      EndIf
    EndIf
  EndIf
 
  ;--- Write tvi\dwMask TBBUTTONINFO to taskbar
  tvi.TV_ITEM
  tvi\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_SELECTEDIMAGE
   tvi\pszText = *Buff1 + SizeOf(TV_ITEM)
  tvi\cchTextMax = 260
  ;--- Loop through all tree items
  If *Buff1
   
    NewList LDTree.ListDataTree() : iSaveItem  = 0
   
    hItem = SendMessage_(hwndTreeView, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
   
    While hItem  
      AddElement(LDTree()) : LDTree()\Hendel = hItem : LDTree()\Numer = iSaveItem
      TreeViem(hwndTreeView, hItem, iSaveItem, LDTree())      
      hItem = SendMessage_(hwndTreeView, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem)
    Wend
 
    ResetList(LDTree())  
    ForEach LDTree()
   
      tvi\hItem = LDTree()\Hendel      
      WriteProcessMemory_(tvPrc, *Buff1, @tvi, buffSize, @result)
      ;--- Get the tree item info
      SendMessage_(hwndTreeView, #TVM_GETITEM, i, *Buff1)        
      ;- get the item image info
      ReadProcessMemory_(tvPrc, *Buff1, @tvi, SizeOf(tvi), @result)
      itemText.s = Space(260)
      ;- Get the item text
      ReadProcessMemory_(tvPrc, tvi\pszText, @itemText, 260, @result)
      AddGadgetItem(0, -1, itemText, 0, LDTree()\Numer)
    Next
   
    FreeList(LDTree())
 
    VirtualFreeEx_(tvPrc, *Buff1, 0, #MEM_RELEASE)
    CloseHandle_(tvPrc)
  EndIf
EndProcedure
 
If OpenWindow(0, 0, 0, 200, 200, "Test by Sparkie",  #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
  TreeGadget(0, 5, 5, 190, 190, #PB_Tree_CheckBoxes  )
 
  ventText.s = Space(255)
  VentriloHWND = FindWindow_(0, "TreeGadgetTest")
  ventTextLen = GetWindowText_(VentriloHWND, @ventText, 255)
  EnumChildWindows_(VentriloHWND, @EnumCallback(), 0)
   
  If VentriloHWND And ventTreeHWND
    EnumTreeItems(VentriloHWND, ventTreeHWND)
  Else
    MessageRequester("Error", "Ventrilo not found", #PB_MessageRequester_Ok | #MB_ICONERROR)
    End
  EndIf
 
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
End



-DEl-


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Прочитать чужой SysTreeView32
СообщениеДобавлено: Пт мар 27, 2020 6:01 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 426
Благодарил (а): 8 раз.
Поблагодарили: 18 раз.
Пункты репутации: 0
Не подскажите как правильно удалить из SysTabControl32 выделенный пункт, чтоб элементы не мерцали?
Тестовая программа
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  ; Shows using of several panels...
  If OpenWindow(0, 0, 0, 322, 220, "TreeGadgetTest", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
        PanelGadget (1, 5, 5, 290, 166)
          AddGadgetItem(1, -1, "Sub-Panel 1")
          AddGadgetItem(1, -1, "Sub-Panel 2")
          AddGadgetItem(1, -1, "Sub-Panel 3")
        CloseGadgetList()
      AddGadgetItem (0, -1,"Panel 2")
        ButtonGadget(2, 10, 15, 80, 24,"Button 1")
        ButtonGadget(3, 95, 15, 80, 24,"Button 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
 
 


Сама программа
Код:
1
2
3
4
5
6
7
8
9
 
Procedure Del_Find_systabcontrol32(hWnd)
  index =  SendMessage_(hWnd,#TCM_GETCURSEL,0,0)  
  SendMessage_(hWnd,#TCM_DELETEITEM,index,0)  
EndProcedure
 
VentriloHWND = FindWindow_(0, "TreeGadgetTest")
hWnd1 = FindWindowEx_(VentriloHWND,0,"SysTabControl32",0)
Del_Find_systabcontrol32(hWnd1)



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot], Majestic-12 [Bot] и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB