Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.20.56] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.Заранее извиняю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) . Спасибо. |
Сообщ.
#2
,
|
|
|
Попробуй API SendMessage с сообщением LVM_GETITEMTEXTA и LVM_GETITEMTEXTW, может поможет получить текст элементов SysListView32 из другого приложения с комбинированными стилями LVS_OWNERDATA и LVS_OWNERDRAWFIXED одновременно.
Вот пример кода на AutoIt: #include <WinAPI.au3> #include <WinAPIConstants.au3> #include <WinAPILocale.au3> #include <WinAPIProc.au3> #include <WinAPISys.au3> #include <Constants.au3> #include <WindowsConstants.au3> Local $hWnd = WinGetHandle("[CLASS:SysListView32]") ; получаем хендл окна SysListView32 Local $dwPID Local $hProc = _WinAPI_OpenProcess($PROCESS_VM_READ, False, $dwPID) ; получаем хендл процесса Local $iItemCount = _SendMessage($hWnd, $LVM_GETITEMCOUNT, 0, 0) ; получаем количество элементов в списке Local $iBufferSize = 1024 ; задаем размер буфера Local $pBuffer = _WinAPI_VirtualAllocEx($hProc, 0, $iBufferSize, $MEM_COMMIT, $PAGE_READWRITE) ; выделяем память в процессе For $i = 0 To $iItemCount - 1 Local $iTextLength = _SendMessage($hWnd, $LVM_GETITEMTEXTLENGTHA, $i, 0) ; получаем длину текста элемента If $iTextLength > 0 Then Local $pTextBuffer = _WinAPI_VirtualAllocEx($hProc, 0, $iTextLength + 1, $MEM_COMMIT, $PAGE_READWRITE) ; выделяем память в процессе для текста _SendMessage($hWnd, $LVM_GETITEMTEXTA, $i, $pTextBuffer) ; получаем текст элемента Local $sText = _WinAPI_ReadProcessMemoryString($hProc, $pTextBuffer, $iTextLength, $CP_ACP) ; получаем текст элемента из буфера ConsoleWrite($sText & @CRLF) ; выводим текст элемента в консоль _WinAPI_VirtualFreeEx($hProc, $pTextBuffer, 0, $MEM_RELEASE) ; освобождаем выделенную память EndIf Next _WinAPI_VirtualFreeEx($hProc, $pBuffer, 0, $MEM_RELEASE) ; освобождаем выделенную память _WinAPI_CloseHandle($hProc) ; закрываем хендл процесса Этот код получает хендл окна SysListView32, получает хендл процесса, выделяет память в процессе, перебирает элементы в списке, получает длину текста элемента и текст элемента с помощью API SendMessage и _WinAPI_ReadProcessMemoryString, освобождает выделенную память и закрывает хендл процесса. |
Сообщ.
#3
,
|
|
|
Цитата MaIron @ Изначально я проверял и сообщение LVM_GETITEMTEXT тоже . Не работает это сообщение с стилем LVS_OWNERDATA. А оно и не должно работать. Вот что написано в MSDN по поводу виртуальной ListView. Цитата The following messages are not supported under the LVS_OWNERDATA style: LVM_ENABLEGROUPVIEW, LVM_GETITEMTEXT, LVM_SETTILEINFO, and LVM_MAPIDTOINDEX. Так что ваш код тоже не сработает. Это точно. |