На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> получить текст SysListView32(LVS_OWNERDATA+LVS_OWN ERDRAWFIXED) из приложений
    Здравствуйте.Заранее извиняюc если не в том месте создал тему так как считаю что моя задача имеет прямое или косвенное отношение к WinApi. Опишу задачу :
    Программирую имитацию ручной работы в приложениях для работы на финансовых рынках ( Metatrader 4 и 5) . Использую для этого AutoIt.Понадобилось прочитать текст элементов SysListView32. Написал вот такой код для этой цели.

    ExpandedWrap disabled
      #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) . Спасибо.
      Попробуй API SendMessage с сообщением LVM_GETITEMTEXTA и LVM_GETITEMTEXTW, может поможет получить текст элементов SysListView32 из другого приложения с комбинированными стилями LVS_OWNERDATA и LVS_OWNERDRAWFIXED одновременно.

      Вот пример кода на AutoIt:

      ExpandedWrap disabled
        #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, освобождает выделенную память и закрывает хендл процесса.
        Цитата 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.

        Так что ваш код тоже не сработает. Это точно.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0302 ]   [ 16 queries used ]   [ Generated: 27.04.24, 11:50 GMT ]