Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Получить текст из ListBox другой программы


Автор: Pilger 4.7.2008, 00:36
Здравствуйте!
Имеется чужая программа с ListBox'ом на ней.
Требуется получить из этого ListBox'а текст под последним заполненным индексом (в другой программе).
Количество элементов в ListBox'е я нашел:
Код

SendMessage(ListBox, LB_GETCOUNT, 0, 0)

Длину нужного индекса тоже:
Код

SendMessage(ListBox, LB_GETTEXTLEN, Index, 0)

Вопрос: Как теперь достать текст из нужного мне индекса? Я смотрел, как это делается на C++, но тут что то не сходится. Куда он должен сохранять значение и как его получить, если функция возвращает Integer?
Заранее спасибо.

Автор: Partizan 4.7.2008, 17:44
Pilger, LB_GETTEXT ...
в lParam индекс строки, в wParam передаётся указатель на буфер, в который запишется текст...

если я не ошибаюсь там какието грабли с записью в буфер...тоесть память под строку надо выделять в адресном пространстве процесса, в котором находится листбокс...и читать соответственно тоже оттуда придётся...

Автор: Pilger 6.7.2008, 02:58
Большое спасибо за наводку. Будем рыть в этом направлении.

Автор: DarkDragon 18.7.2008, 13:04
Partizan, 
точнее, так:
 wParam - index
 lParam - pointer on buffer

никаких граблей не должно быть, просто нужно буфер символов увеличить этак на 4 : smile

Простите непомню как на VB.NET  smile 
Код

[DllImport("user32.dll")]
SendMessage (IntPtr hwnd, uint msg, int wParam, string lParam);

Автор: Partizan 18.7.2008, 13:25
DarkDragon, если выделить память в одном процессе и передать указатель в другой процесс, то грабли будут гарантированно, т.к. каждый процесс имеет своё собственное адресное пространство.

Автор: DarkDragon 18.7.2008, 16:36
Цитата(Partizan @  18.7.2008,  13:25 Найти цитируемый пост)
DarkDragon, если выделить память в одном процессе и передать указатель в другой процесс, то грабли будут гарантированно, т.к. каждый процесс имеет своё собственное адресное пространство. 

Да не в этом дела. Когда вы посылаете LB_GETTEXT, то возвращается не указатель, а берется указатель переданный в lparam и копируется строка туда(т. е. в ваш процесс). Не верите? проверьте сами!

Автор: Partizan 18.7.2008, 17:01
DarkDragon, у меня лично были такие грабли с чтением текста из статусбара стороннего процесса...

Автор: DarkDragon 18.7.2008, 20:04
Дело в том что правильно организованные данные и передача аргументов решает практически все проблемы. Насколько я помню грабли могут появиться в работе с буфером обмена (Clipboard) там требуется глобальное выделение памяти, а иначе можно получить костыли. Еще могу советовать почаще заглядывать в MSDN, т. к. если есть какие-то нюансы, Microsoft добропорядочно описывает их (конечно в MSDN не найдешь недокументированных возможностей, но кто мешает использовать DDK?)   smile 

Ну вот окончательно попробуйте вот это:
Код

string LBItem (IntPtr hWnd, short index)
{
   string buff = new char [128];
   SendMessage(hWnd, LB_GETTEXT, (int)index, buff);
   return buff;
}


Должно сработать  smile 

Автор: Pilger 19.7.2008, 18:41
Большое спасибо! Все получилось. (как раз вернулся из отпуска) Решение на VB Net.
Код

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Declare Function SendMessageStr Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As Integer

Dim Index As Integer = SendMessage(ListBox, LB_GETCOUNT, 0, 0) - 1 'Получаем номер последнего индекса в ListBox
Dim Lange As Integer = SendMessage(ListBox, LB_GETTEXTLEN, Index, 0) 'Получаем длину последнего индекса
Dim Buff As New System.Text.StringBuilder(Lange) 'Создаем буфер с размером нужного индекса

SendMessageStr(ListBox, LB_GETTEXT, Index, Buff) 'Сохраняем в буфер текст последнего индекса

txtAntwort.Text = Buff.ToString() 'Выдаем текст из буфера в TextBox


Большое спасибо за помощь. Я не могу повысить вам репутацию, к сожалению. Если можно, то повысьте пожалуйста от моего имени.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)