powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / vb.net treeview сторонней программы сделать item checked=true
9 сообщений из 9, страница 1 из 1
vb.net treeview сторонней программы сделать item checked=true
    #38869365
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. имеется treeView c чекбоксами в стороннем приложении.
необходимо найти определенный itrm и поставить на него галочку ( т.е. сделать checked=true)
думаю что это возможно через sendmesage но найти информацию такого рода не могу((
может кто знает как такое реализовать?
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869413
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec,

Код: vbnet
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.
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Type TVITEM
    mask As Long
    hItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    iSelectedImage As Long
    cChildren As Long
    lParam As Long
End Type
Private Const TVIF_STATE As Long = &H8
Private Const TVIF_HANDLE As Long = &H10
Private Const TVIS_CHECKED = &H2000&
Private Const TV_FIRST = &H1100
Private Const TVM_SETITEM As Long = (TV_FIRST + 13)
Private Const TVM_GETITEM As Long = (TV_FIRST + 12)

Sub SetItemChecked(ByVal hTreeView As Long, ByVal hItem As Long, ByVal IsChecked As Boolean)
Dim tvi As TVITEM
 
tvi.mask = TVIF_STATE Or TVIF_HANDLE
tvi.hItem = hItem
If IsChecked Then
    tvi.state = GetItemState(hTreeView, hItem) Or TVIS_CHECKED
Else
    tvi.state = GetItemState(hTreeView, hItem) And Not TVIS_CHECKED
End If
SendMessage hTreeView, TVM_SETITEM, 0&, tvi
End Sub
 
Function GetItemState(ByVal hTreeView As Long, ByVal hItem As Long) As Long
Dim tvi As TVITEM
tvi.mask = TVIF_STATE Or TVIF_HANDLE
tvi.hItem = hItem
SendMessage hTreeView, TVM_GETITEM, 0&, tvi
GetItemState = tvi.state
End Function

Private Sub Command1_Click()
SetItemChecked 264210, 1, True
End Sub



пока нашел только это. но при попытке изменить checked программа с treeview вылетает с ошибкой:

Имя события проблемы: APPCRASH
Имя приложения: Performance.exe
Версия приложения: 1.1.76.16
Отметка времени приложения: 4a5bc9a4
Имя модуля с ошибкой: COMCTL32.dll
Версия модуля с ошибкой: 6.10.7601.17514
Отметка времени модуля с ошибкой: 4ce7c45b
Код исключения: c0000005
Смещение исключения: 000000000009651e
Версия ОС: 6.1.7601.2.1.0.256.48
Код языка: 1049
Дополнительные сведения 1: d846
Дополнительные сведения 2: d846d650c9652838446cdc5df96797e8
Дополнительные сведения 3: f6a0
Дополнительные сведения 4: f6a0ff0351922a65a1e170d4368c6458
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869439
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec,

ха .. походу я туплю hitem - это хендл итема а не индекс?
если так то как найти итем по индексу?
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869505
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec,

все равно вылетает.. делаю выбор root нода и подставляю хендл к функции. приложение падает также. в чем дело не могу понять..((
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869512
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так нельзя делать. Объектное представление коммон контрола не зависит напрямую от его внутреннего состояния, управляемого через WinAPI (по крайней мере так было с ocx, идущими в составе VB6). Между внутренним состоянием айтема и свойством объекта есть прослойка в виде локальной переменной, значение которой не обновится при вмешательстве напрямую в TVITEM. Нужно имитировать клик пользователя на чекбоксе, тогда объектное представление корректно отработает изменение состояния.

surbanecесли так то как найти итем по индексу?У TVITEM нет индекса.

Код: vbnet
1.
SendMessage hTreeView, TVM_GETITEM, 0&, tvi

Почему передается ноль, а не Len(tvi)?
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869536
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТак нельзя делать. Объектное представление коммон контрола не зависит напрямую от его внутреннего состояния, управляемого через WinAPI (по крайней мере так было с ocx, идущими в составе VB6). Между внутренним состоянием айтема и свойством объекта есть прослойка в виде локальной переменной, значение которой не обновится при вмешательстве напрямую в TVITEM. Нужно имитировать клик пользователя на чекбоксе, тогда объектное представление корректно отработает изменение состояния.

surbanecесли так то как найти итем по индексу?У TVITEM нет индекса.

Код: vbnet
1.
SendMessage hTreeView, TVM_GETITEM, 0&, tvi

Почему передается ноль, а не Len(tvi)?

короче не удачная затея... а как иметировать клик по определенному ноду ... я даже не представляю..
авторПочему передается ноль, а не Len(tvi)?
не знаю даже. я содрал этот код. и в большинстве источников именно 0&
ничего это не меняет. при потправки меседжа приложение глохнет.. я помню было такое. в диспетчере задач в листвью пытался удалить итем. получалось примерно тоже самое. вылет., однако такое удаление хорошо работало с листвью эксплорера.
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869538
Фотография surbanec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТак нельзя делать. Объектное представление коммон контрола не зависит напрямую от его внутреннего состояния, управляемого через WinAPI (по крайней мере так было с ocx, идущими в составе VB6). Между внутренним состоянием айтема и свойством объекта есть прослойка в виде локальной переменной, значение которой не обновится при вмешательстве напрямую в TVITEM. Нужно имитировать клик пользователя на чекбоксе, тогда объектное представление корректно отработает изменение состояния.

surbanecесли так то как найти итем по индексу?У TVITEM нет индекса.

Код: vbnet
1.
SendMessage hTreeView, TVM_GETITEM, 0&, tvi

Почему передается ноль, а не Len(tvi)?

короче не удачная затея... а как иметировать клик по определенному ноду ... я даже не представляю..
авторПочему передается ноль, а не Len(tvi)?
не знаю даже. я содрал этот код. и в большинстве источников именно 0&
ничего это не меняет. при потправки меседжа приложение глохнет.. я помню было такое. в диспетчере задач в листвью пытался удалить итем. получалось примерно тоже самое. вылет., однако такое удаление хорошо работало с листвью эксплорера.
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38869743
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec Имя события проблемы: APPCRASH
Не ну ты хоть Long-и то заменил бы для начала правильно на Integer/IntPtr
В .Net Long означает совсем другое что в VB6
и вот такое тупое использование в половине случаев просто не приведет к результату, а во второй половине приведет как раз к крашу.
Если конечно ты пытаешься сделать то что ты хочешь на VB.Net а не на VB6.

А по поводу того что есть объектная прослойка и возможно так делать нельзя Antonariy возможно прав, хотя попытка не пытка.
Во всяком случае с VB6-ListView некоторые вещи даже со своим ListView через API из-за этой прослойки делать нельзя (кажется добавление итемов), с Treeview так глубоко не копал.
...
Рейтинг: 0 / 0
vb.net treeview сторонней программы сделать item checked=true
    #38870158
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
surbanec,

Остается только одно - делать через SendKey.

Ставить фокус в нужный контрол, и слать стрелочки - как нажатия клавиатуры.

Это очень плохо - скринсейвер будет мешать такой связке работать - но хоть как-то...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / vb.net treeview сторонней программы сделать item checked=true
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]