1

Тема: AHK: Чтение части списка

Добрый день. Необходимо сделать так, что бы список из одной программы отображался на других компьютерах сети. Основная проблема заключается в размерах списка, более 4 тысяч позиций. При этом более свежая часть списка(скажем последние 50 – 100 позиций) могут периодически обновляться. И их нужно считывать каждые 5-10 минут.
C чтением списка справляется такой код:

ControlGet, List1, List, , SysListView321, ЗаголовокПрограммы

Loop, Parse, List1, `n 
{
IniWrite, %A_LoopField%, D:\ListMess.ini, List_In, Ms%A_Index%
NumIn := A_Index
}

IniWrite,  %NumIn%, D:\ListMess.ini, List_In, Total

Но, это действие занимает у него пару минут, и хорошо грузит старенький компьютер. Есть возможность считать в переменную только определенное число строк из начала списка?

2

Re: AHK: Чтение части списка

считать в переменную только определенное число строк

ControlGet, так долго загружает в переменную?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Чтение части списка

Вот так можно попробовать:

Number := 100

ControlGet, List1, List, , SysListView321, ЗаголовокПрограммы

Loop, Parse, List1, `n 
{
   IniWrite, %A_LoopField%, D:\ListMess.ini, List_In, Ms%A_Index%
   NumIn := A_Index
} until A_Index = Number

IniWrite,  %NumIn%, D:\ListMess.ini, List_In, Total
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Чтение части списка

teadrinker, спасибо, теперь время выполнения кода укладывается в минуту, основное время загрузки видимо занимала запись в ini фаил

5

Re: AHK: Чтение части списка

А у меня очень долго читается список. Он, правда большой. 100000 строк и 9 колонок.  Вот это

 ControlGet, List1, List, , SysListView321, ЗаголовокПрограммы

занимает до минуты.

Пробовал читать строками

ControlGet, var, List, Row1, SysListView321, ЗаголовокПрограммы

всё равно читает весь список. Хотя то  же самое с "Col1" работает - читаются именно колонки. Так и должно быть?

6

Re: AHK: Чтение части списка

А что за параметр такой: "Row1"?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Чтение части списка

Смелое предположение, что если существует "Col4 считывает только четвёртую колонку (поле). Замените 4 на нужный номер.", то должен быть и  "Row1". Как-то нелогично, что колонками читать можно, а строками нет.
  Ошибка?

8 (изменено: serzh82saratov, 2013-11-29 21:15:05)

Re: AHK: Чтение части списка

В некоторых SysListView32 работает так:


#SingleInstance Force
#Persistent  

 ; http://www.autohotkey.com/board/topic/81820-how-to-get-specific-row-text-in-a-syslistview32-easily/#entry522080 
 
row := 1 ; Какую строку читать
   
ControlGet, handle, Hwnd, , SysListView321, ahk_class µTorrent4823DF041B09 
 ; ControlGet, handle, Hwnd, , SysListView321, ahk_class Progman 
 ; У меня не работает на рабочем столе

ControlGet, CountCol, List,Count Col,, ahk_id %handle%
 
Loop % CountCol
    Text .= LvGetText(handle, row, A_Index) . (A_Index = CountCol ? "" : "  |  ")
    
MsgBox % Text

LvGetText(hListView,r=1,c=1)
{
    r--, ntemp := dwProcessId := 0
    DllCall("GetWindowThreadProcessId", UInt,hListView, UIntP,dwProcessId)
    hProcess := DllCall("OpenProcess", UInt,0x001F0FFF, Int,false, UInt,dwProcessId) ; 0x001F0FFF = PROCESS_ALL_ACCESS
    lpProcessBuf1 := DllCall("VirtualAllocEx", UInt,hProcess, UInt,ntemp, UInt,28, UInt,0x1000, UInt,4)
       ; 28 = size of lvItem, 0x1000 = MEM_COMMIT, 4 = PAGE_READWRITE
    lpProcessBuf2 := DllCall("VirtualAllocEx", UInt,hProcess, UInt,ntemp, UInt,512, UInt,0x1000, UInt,4) ; text buffer
    VarSetCapacity(t, 511, 1)
    VarSetCapacity(lvItem, 28)
    NumPut(1, lvItem, "uint")  ; mask
    NumPut(0, lvItem, A_PtrSize, "int")  ; iItem 0 means the first row; anyhow, when sending the LVM_GETITEMTEXT message, we can specify a different item
    NumPut(c-1, lvItem, A_PtrSize * 2, "int")  ; iSubItem 0 means the first column
    NumPut(lpProcessBuf2, lvItem, A_PtrSize * 5, "ptr")  ; pszText
    NumPut(512, lvItem, A_PtrSize * 6) ; cchTextMax
    DllCall("WriteProcessMemory", UInt,hProcess, UInt,lpProcessBuf1, UInt,&lvItem, UInt,28, UInt,ntemp)
    DllCall("SendMessage", "uint", hListView, "uint", (A_IsUnicode ? 0x1000 + 0x73 : 0x1000 + 0x2D), "uint", r, "ptr", lpProcessBuf1)
    DllCall("ReadProcessMemory", UInt,hProcess, UInt,lpProcessBuf2, UInt,&t, UInt,512, UInt,ntemp)
    DllCall("VirtualFreeEx", UInt,hProcess, UInt,lpProcessBuf1, UInt,0, UInt,0x8000) ; 0x8000 = MEM_RELEASE
    DllCall("VirtualFreeEx", UInt,hProcess, UInt,lpProcessBuf2, UInt,0, UInt,0x8000)
    DllCall("CloseHandle", UInt,hProcess) 
    return t
}

Esc:: 
    ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Чтение части списка

Правильно я понял, что

ControlGet, var, List, Col1, SysListView321, ЗаголовокПрограммы

это нормально, а

ControlGet, var, List, Row1, SysListView321, ЗаголовокПрограммы

неверный код?

10

Re: AHK: Чтение части списка

Нет такого параметра как "Row".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui