Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2023, 21:15   #1
ilqar200
Новичок
Джуниор
 
Регистрация: 01.04.2023
Сообщений: 2
По умолчанию получить текст элементов SysListView32(LVS_OWNERDATA+LVS_OWN ERDRAWFIXED) из других приложений

Здравствуйте.Заранее извиняюc если не в том месте создал тему так как считаю что моя задача имеет прямое или косвенное отношение к WinApi. Опишу задачу :
Программирую имитацию ручной работы в приложениях для работы на финансовых рынках ( Metatrader 4 и 5) . Использую для этого AutoIt.Понадобилось прочитать текст элементов SysListView32. Написал вот такой код для этой цели.
Код:
#include <WinAPI.au3>
#include <Memory.au3>
#include <ListViewConstants.au3>
Local $pid=        ; тут пишу идентификатор процесса нужного приложение
Local $hwnd=      ;тут пишу  хендл SysListView32 (беру из AutoIt WIndow Info Tool)
Local $maxtext=    ; тут пишу максимальное количество символов
Local $hprocess=_WinAPI_OpenProcess($PROCESS_ALL_ACCESS,False,$pid)
Local $plv=_MemVirtualAllocEx($hprocess,Null,$maxtext+60,$MEM_COMMIT,$PAGE_READWRITE)
Local $rectext=DllStructCreate("char ["&$maxtext&"]")
Local $lv=DllStructCreate($tagLVITEM)
$lv.Mask=$LVIF_TEXT
$lv.Item=0
$lv.SubItem=0
$lv.Text=$plv+60
$lv.TextMax=$maxtext
_WinAPI_WriteProcessMemory($hprocess,$plv,DllStructGetPtr($lv),60,Null)
_SendMessageA($hwnd,$LVM_GETITEMA,0,$plv)
_WinAPI_ReadProcessMemory($hprocess,$lv.Text,DllStructGetPtr($rectext),$maxtext,Null)
_MemVirtualFreeEx($hprocess,$plv,0,$MEM_RELEASE)
ConsoleWrite(DllStructGetData($rectext,1))
Проблема в том что выше код получает текст только если SysListView32 имеет стиль или LVS_OWNERDATA или LVS_OWNERDRAWFIXED. Но этот код не получает текст
элементов SysListView32 с комбинированными стилями LVS_OWNERDATA и LVS_OWNERDRAWFIXED.
Ну вот вопрос :
Как получить текст элементов из SysListView32 из другого приложение с стилями и LVS_OWNERDATA и LVS_OWNERDRAWFIXED одновременно?
Хотелось бы получить примерно направление действий или пример кода( неважно на AutoIt) . Спасибо.

Последний раз редактировалось ilqar200; 01.04.2023 в 21:19.
ilqar200 вне форума Ответить с цитированием
Старый 02.04.2023, 14:32   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,357
По умолчанию

Попробуйте с помощью LVN_GETDISPINFO.
Если не поможет, тогда скорее всего никак - LVS_OWNERDRAWFIXED указывает что приложение будет само рисовать содержимое и соответственно сможет брать данные где угодно.

Ref:
https://learn.microsoft.com/en-us/wi...vn-getdispinfo
waleri вне форума Ответить с цитированием
Старый 02.04.2023, 21:33   #3
ilqar200
Новичок
Джуниор
 
Регистрация: 01.04.2023
Сообщений: 2
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Попробуйте с помощью LVN_GETDISPINFO.
Если не поможет, тогда скорее всего никак - LVS_OWNERDRAWFIXED указывает что приложение будет само рисовать содержимое и соответственно сможет брать данные где угодно.

Ref:
https://learn.microsoft.com/en-us/wi...vn-getdispinfo
Я прочел статьи в MSDN про LVN_GETDISPINFO про виртуальный(LVS_OWNERDATA) SysListView32 и про сообщения WM_NOTIFY. Про виртуальный SysListView32 написано что другие процессы запрашивают сведения об элементе у владельца с помощью LVN_GETDISPINFO.Про LVN_GETDISPINFO написано что это уведомление отправляться внутри сообщения WM_NOTIFY . А про WM_NOTIFY написано что это сообщение невозможно отправить между процессами.Какой-то замкнутый круг получается. Как можно в этом случае реализовать LVN_GETDISPINFO ? Решит ли вообще LVN_GETDISPINFO задачу ?
В мониторе сообщений Spy++ родительского окна SysListView32 когда я разворачиваю главное окно программы то там появляется сообщении WM_NOTIFY,WM_DRAWITEM и другие но нужный текст нету внутри сообщениях . Нужный текст нету также внутри сообщениях в мониторе сообщений Spy++ самого SysListView32(LVM_GETITEMA показывает пустой текст).Полагаю что нужный текст находиться внутри виртуальной памяти процесса программы. Но как получить этот текст и где этот текст находиться внутри памяти процесса ?
ilqar200 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стилизация консольных приложений на базе Symfony, Laravel, Yii и других фреймворков c помощью Termage awilum PHP 0 25.10.2021 19:26
Изменение памяти других приложений mixer94 Общие вопросы Delphi 3 30.03.2010 20:31
Граббер с других приложений LeoN Общие вопросы Delphi 0 14.12.2009 19:20
перевод String to PAnsiChar (Запуск других приложений) ke6ko Общие вопросы Delphi 2 09.07.2009 20:47