Просмотр полной версии : Работа с SysListView32 (L2Walker)
В общем...
Такая задача:
Есть чужое окно. В чужом окне есть компонент SysListView32. Мне нужно управлять этим компонентом. Ну хотя бы для начала получить из этого SysListView32 все данные что там есть.
Что я пробовал:
Есть функция:
function ListView_GetItem(hWnd: HWND; var pItem: TLVItem): Bool;
Эта функция получает 1 строку из SysListView32.
Я пробовал через эту функцию получить хотя бы 1 итем, но безрезультатно, если передавать туда переменную типа TLVItem, то на выходе она выходит пустая все равно... Кто сталкивался с такой задачей и может мне хоть в чем-нибудь помочь?
P.S. Если конкретно - я пытаюсь управлять ItemList'ом волкера
Сейчас я предложу не совсем то, чего хочет автор :)
Волкер обычно используется в комплекте с ПХ или ВП, так почему бы не воспользоваться для решения поставленной задачи функционалом этих программ?
Сейчас я предложу не совсем то, чего хочет автор :)
Волкер обычно используется в комплекте с ПХ или ВП, так почему бы не воспользоваться для решения поставленной задачи функционалом этих программ?
Привык уже просто =) Да и я столкнулся с чем-то новым, а мне нравится копаться в чем-то новом, может потом пригодится)
ListView_GetItemCount
и дальше в цикле ListView_GetItem
ListView_GetItemCount
и дальше в цикле ListView_GetItem
Я же написал в первом посте, что пробовал так - не получается (переменная, которую я подаю туда, остается такой же)
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, а приер реализации можешь кинуть?
Kilatif, а приер реализации можешь кинуть?
ну... получить полностью итем через GetItem я так и не смог) Но я обошелся получением текста (GetItemText). Если все таки надо, могу скинуть
ну... получить полностью итем через GetItem я так и не смог) Но я обошелся получением текста (GetItemText). Если все таки надо, могу скинуть
Все, даж тестировать теперь не буду xD
Передача указателя явно работает в данном случае значит)))
Во-первы в этом случае ты в любом случае одним из параметров указываешь буфер, куда строка помещается...
А во-вторых этот макрос в любом случае так же создает LVITEM)
Все, даж тестировать теперь не буду xD
Передача указателя явно работает в данном случае значит)))
Во-первы в этом случае ты в любом случае одним из параметров указываешь буфер, куда строка помещается...
А во-вторых этот макрос в любом случае так же создает LVITEM)
Я пробовал делал как ты писал, это я делал в первую очередь и ничего абсолютно не получилось. После я уже нашел инфу о том что беда с виртуальной памятью. Но если у тебя получится сделать - выкладывай исходники, очень будет любопытно посмотреть в чем же я все таки ошибся)
Я пробовал делал как ты писал, это я делал в первую очередь и ничего абсолютно не получилось. После я уже нашел инфу о том что беда с виртуальной памятью. Но если у тебя получится сделать - выкладывай исходники, очень будет любопытно посмотреть в чем же я все таки ошибся)
Если надо, могу попробовать... А можешь и сам, если интересно)
Если брать 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))
Хотя по сути, если тебя устраивает получение только текста, то и заморачиваться не стоит)))
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot