PDA

Просмотр полной версии : Работа с SysListView32 (L2Walker)


Kilatif
28.02.2011, 23:09
В общем...
Такая задача:
Есть чужое окно. В чужом окне есть компонент SysListView32. Мне нужно управлять этим компонентом. Ну хотя бы для начала получить из этого SysListView32 все данные что там есть.

Что я пробовал:
Есть функция:
function ListView_GetItem(hWnd: HWND; var pItem: TLVItem): Bool;
Эта функция получает 1 строку из SysListView32.
Я пробовал через эту функцию получить хотя бы 1 итем, но безрезультатно, если передавать туда переменную типа TLVItem, то на выходе она выходит пустая все равно... Кто сталкивался с такой задачей и может мне хоть в чем-нибудь помочь?

P.S. Если конкретно - я пытаюсь управлять ItemList'ом волкера

J-Fobos
01.03.2011, 00:22
Сейчас я предложу не совсем то, чего хочет автор :)
Волкер обычно используется в комплекте с ПХ или ВП, так почему бы не воспользоваться для решения поставленной задачи функционалом этих программ?

Kilatif
01.03.2011, 00:29
Сейчас я предложу не совсем то, чего хочет автор :)
Волкер обычно используется в комплекте с ПХ или ВП, так почему бы не воспользоваться для решения поставленной задачи функционалом этих программ?

Привык уже просто =) Да и я столкнулся с чем-то новым, а мне нравится копаться в чем-то новом, может потом пригодится)

Aries
01.03.2011, 01:57
ListView_GetItemCount
и дальше в цикле ListView_GetItem

Kilatif
01.03.2011, 03:25
ListView_GetItemCount
и дальше в цикле ListView_GetItem

Я же написал в первом посте, что пробовал так - не получается (переменная, которую я подаю туда, остается такой же)

Aries
01.03.2011, 10:02
LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_STATE;
lvi.stateMask = 0x3000;
lvi.pszText = tmpParam;
lvi.cchTextMax = sizeof(tmpParam);
for (int i = 0; i < RowCount; ++i) {
lvi.iSubItem = 0;
lvi.iItem = i;
if(!ListView_GetItem(hList,&lvi)) continue;
lvi.iSubItem = 1;
if(!ListView_GetItem(hList,&lvi)) continue;
lvi.iSubItem = 2;
if(!ListView_GetItem(hList,&lvi)) continue;
}
Что-то типо того... Потом все значения из lvi бери...iSubItem - столбец... RowCount - число строк
tmpParam - буфер, куда записывается строка со значением ячейки

Kilatif
01.03.2011, 15:06
Не знаю как в си, но в делфе это не работает.Вся беда в том что нельзя вот так вот осуществлять адресацию, т.е. передавать адрес переменной в которую будет писать. Потому что мы посылаем этот адрес в чужую программу, а у нее не будет доступа к области памяти нашей программы (где и хранится эта переменная). Что бы решить задачу, нужно использовать виртуальную память.
В общем... я уже решил задачу =)

Aries
01.03.2011, 15:20
Не знаю как в си, но в делфе это не работает.Вся беда в том что нельзя вот так вот осуществлять адресацию, т.е. передавать адрес переменной в которую будет писать. Потому что мы посылаем этот адрес в чужую программу, а у нее не будет доступа к области памяти нашей программы (где и хранится эта переменная). Что бы решить задачу, нужно использовать виртуальную память.
В общем... я уже решил задачу =)

Хм, возможно и так... Но я помню, что на каком-то форуме доказывалось, что подобные сообщения с передачей указателя нормально отрабатывают с разными приложениями (но сам лично не тестил, все делал только в рамках своего приложения)

Kilatif
01.03.2011, 15:25
Хм, возможно и так... Но я помню, что на каком-то форуме доказывалось, что подобные сообщения с передачей указателя нормально отрабатывают с разными приложениями (но сам лично не тестил, все делал только в рамках своего приложения)

ну вот я потестил, ничего не выходит...

Aries
01.03.2011, 15:39
На досуге надо будет тоже ради интереса глянуть)))

Mlex
01.03.2011, 16:15
Kilatif, а приер реализации можешь кинуть?

Kilatif
01.03.2011, 18:48
Kilatif, а приер реализации можешь кинуть?

ну... получить полностью итем через GetItem я так и не смог) Но я обошелся получением текста (GetItemText). Если все таки надо, могу скинуть

Aries
01.03.2011, 20:34
ну... получить полностью итем через GetItem я так и не смог) Но я обошелся получением текста (GetItemText). Если все таки надо, могу скинуть

Все, даж тестировать теперь не буду xD
Передача указателя явно работает в данном случае значит)))
Во-первы в этом случае ты в любом случае одним из параметров указываешь буфер, куда строка помещается...
А во-вторых этот макрос в любом случае так же создает LVITEM)

Kilatif
01.03.2011, 20:46
Все, даж тестировать теперь не буду xD
Передача указателя явно работает в данном случае значит)))
Во-первы в этом случае ты в любом случае одним из параметров указываешь буфер, куда строка помещается...
А во-вторых этот макрос в любом случае так же создает LVITEM)

Я пробовал делал как ты писал, это я делал в первую очередь и ничего абсолютно не получилось. После я уже нашел инфу о том что беда с виртуальной памятью. Но если у тебя получится сделать - выкладывай исходники, очень будет любопытно посмотреть в чем же я все таки ошибся)

Aries
01.03.2011, 22:54
Я пробовал делал как ты писал, это я делал в первую очередь и ничего абсолютно не получилось. После я уже нашел инфу о том что беда с виртуальной памятью. Но если у тебя получится сделать - выкладывай исходники, очень будет любопытно посмотреть в чем же я все таки ошибся)

Если надо, могу попробовать... А можешь и сам, если интересно)
Если брать C++, получается ты юзаешь такой макрос
#define ListView_GetItemText(hwndLV, i, iSubItem_, pszText_, cchTextMax_) \
{ LV_ITEM _macro_lvi;\
_macro_lvi.iSubItem = (iSubItem_);\
_macro_lvi.cchTextMax = (cchTextMax_);\
_macro_lvi.pszText = (pszText_);\
SNDMSG((hwndLV), LVM_GETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
}
Вот и попробуй ради интереса заметить этот макрос данным текстом, если норм, то дальше пробуй
#define ListView_GetItem(hwnd, pitem) \
(BOOL)SNDMSG((hwnd), LVM_GETITEM, 0, (LPARAM)(LV_ITEM *)(pitem))

Хотя по сути, если тебя устраивает получение только текста, то и заморачиваться не стоит)))