Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить текст из ListBox другой программы 
V
    Опции темы
Pilger
Дата 4.7.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



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

SendMessage(ListBox, LB_GETCOUNT, 0, 0)

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

SendMessage(ListBox, LB_GETTEXTLEN, Index, 0)

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



--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
Partizan
Дата 4.7.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 67



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

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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Pilger
Дата 6.7.2008, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Большое спасибо за наводку. Будем рыть в этом направлении.


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
DarkDragon
Дата 18.7.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



Partizan
точнее, так:
 wParam - index
 lParam - pointer on buffer

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

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

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

PM MAIL   Вверх
Partizan
Дата 18.7.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DarkDragon
Дата 18.7.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



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

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

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  intr_lst.zip 1,78 Kb
PM MAIL   Вверх
Partizan
Дата 18.7.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 67



DarkDragon, у меня лично были такие грабли с чтением текста из статусбара стороннего процесса...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DarkDragon
Дата 18.7.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: 5
Всего: 8



Дело в том что правильно организованные данные и передача аргументов решает практически все проблемы. Насколько я помню грабли могут появиться в работе с буфером обмена (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 

Это сообщение отредактировал(а) DarkDragon - 18.7.2008, 20:07
PM MAIL   Вверх
Pilger
Дата 19.7.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Большое спасибо! Все получилось. (как раз вернулся из отпуска) Решение на 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


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

Это сообщение отредактировал(а) Pilger - 19.7.2008, 18:42


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0738 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.