Снова здравствуйте, есть контрол SysListView32, ему нужно передать текст, находится он в стороннем приложении.
Использовать, я так понимаю надо WindowsMessage.
Скрин для наглядности
http://d-tox.ru/mihail/tmp/dynamic_handle.jpg
Текст бокс появляется при нажатии на одну из ячеек, хотел сначала как-нибудь вызвать текстбокс и передать ему текст, но до эмуляции кликов мышкой скатываться не хочется, а по-другому наверное никак.
Поэтому надо просто передать ячейке ListView текст.
Нашел что для работы с ListView существует куча сообщений (http://olddos.narod.ru/doc/comp/bsp/v22/ch3.html - описание на русском)
Для передачи сообщения нам 100% потребуется:
Private Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) _
As Long
А непосредственно для передачи текста я не знаю, что нужно использовать - LVM_SETITEMTEXT или LVM_INSERTITEM?
Как я ни пытался передавать сообщения сторонней программе, она всевремя падает, поэтому потренироваться сначала наверное лучше на собственном ListView (входит в состав Common Controls)
Пока читал доки наткнулся на загадочный макрос [url=http://msdn.microsoft.com/en-us/library/aa453373.aspx]ListView_SetItemText[/url] как его объявить я не понял, но он бы облегчил дело.
Итак, какое сообщение и как посылать?
Заранее спасибо!
Оно ж не всё так просто как хотелось Получить то данные можно довольно просто SendMassage+LVM_GETITEMTEXT, но как уже заметил Василий, при добавлении записи создается Edit, хендел которого динамический, в который и вводится нужный текст... Далее интереснее...
Все дескрипторы окошек класса SysListView32, не являются уникальными в пределах системы, а только в пределах одного процесса в котором используется этот SysListView32. Кроме того, API для работы c LV, в качестве параметров ожидают указатели на адреса в вирт.АП того процесса, который создал этот LV. Поэтому, если кому-то очень хочеться таки добавить туда новую запись - придется инжектиться в процесс с помощью сторонней DLL например, или же попробовать работать с АП другого процесса через API VirtualAllocEx\ReadProcessMemory\WriteProcessMemory. Как при этом быть в Win9xMe я хз, да и при инжекте DLL фаерволам вроде Outpost'а врядли это понравиться.
HACKER вот это уже интересно.
Нашел большой пример на VB6 где считывались данные из этого контрола, так вот там создавалась копия адресного пространства ListView из процесса и один товарищ смог как-то просто реализовать запись. Я не до конца понимаю весь процесс, поэтому подвиг повторить не смог
пример
http://forum.sources.ru/index.php?showtopic=246484
ссылка для скачки
http://d-tox.ru/mihail/tmp/Code_ControlExtractor.rar
Ну там маршалинг реализуется с помощью какой-то волшебной rpiAccessProcess.dll, по сути, как его реализовать не особо важно, главное факт, что его надо реализовать...