Что нового

восстановление предыдущего выделения объектов в проводнике по комбинации клавиш

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
я никогда не нажимаю ЛКМ - ужé много лет пользуюсь исключительно методом "hover-selection"
Тебе не кажется что нужно было об этом сообщить в начале? :shok:

Чтобы сделать это без ЛКМ, нужно отслеживать выделение постоянно, позже обновлю.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Тебе не кажется что нужно было об этом сообщить в начале?
мне действительно жаль, что это ввело тебя в заблуждение, но своей вины в данном случае не вижу абсолютно. примерно уж как 10 лет я пользуюсь именно этим исключительно удобнейшим способом и даже представить себе не могу как можно пользоваться системой без него. мне и в голову не могло прийти, что ты не учтёшь вероятности того, что параметр выделения объектов может быть назначен именно таким. а это ведь один из самых легкодоступных для изменения пользователем системных параметров, который к тому же в значительной степени определяет стиль работы в ОС. и насколько я думаю, в большинстве случаев активирован именно он

пробовал в этой строке
Код:
Global $sLogFile = @ScriptDir & "\RestoreSelection.log"
изменить @ScriptDir на @TempDir, чтобы log сохранялся в c:\windows\temp, но не получилось. как правильно это сделать?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
своей вины в данном случае не вижу абсолютно
А я вижу.

Правила обязательного оформления тем
Описание:
Здесь указывается подробнейшее описание работы программы, описание ее функций, действий.

Примечания:
Примечания к скрипту. Тут могут находится исходники, некоторые наработки. Так же могут быть указаны подробные действия программы, уточнения.

мне и в голову не могло прийти, что ты не учтёшь вероятности того, что параметр выделения объектов может быть назначен именно таким
Ты будешь удивлён, но я много чего ещё не учёл :whistle:

чтобы log сохранялся в c:\windows\temp, но не получилось. как правильно это сделать?
@TempDir это папка «C:\Documents and Settings\Администратор\Local Settings\Temp». Для windows нужно указать так: @WindowsDir & "\Temp"
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновил (см. вложение).

* Добавил предупреждение и ограничение для Vista или выше.
* Добавлена опция постоянного мониторинга выделения, отключается присвоением False переменной $iMonitor_Selection_Always.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied [?]
Там есть DirectUIHWND
Оно особо не помагает, ControlListView с ним не работает :(
Какие ещё есть методы работы со списком файлов в проводнике?

Alexey [?]
я пользуюсь именно этим исключительно удобнейшим способом и даже представить себе не могу как можно пользоваться системой без него
Кстати, это не безопасная система, можно так случайно вирус запустить :-X
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR
поскольку это не я тебе помогаю, а ты мне, к тому же далеко не в первый раз (за что я не устаю тебя искренне благодарить), то не считаю себя вправе настаивать на своём

Кстати, это не безопасная система, можно так случайно вирус запустить
windows вообще не особо безопасная система ;) а в данном случае мне очень удобно именно такое поведение системы, не требующее лишних кликов

Обновил (см. вложение)
- log не создаётся вообще, так что пока проверить ничего не удалось
- во время работы программы загрузка ЦП резко возрастает с неизменных 2-4% до 50%
(если переменной $iMonitor_Selection_Always присвоить False, то загрузка не возрастатет)
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
при запуске .exe:
Код:
AutoIt Error
Line -1:
Error: Unknown function name.

при запуске .au3:
Код:
Line 57  (File "C:\z\z (original).au3"):
AdlibRegister("_ExplorerMonitorSelection", $iMonitor_Selection_Interval)
^ ERROR
Error: Unknown function name.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
Да, для 3.3.0.0 нужно использовать AdlibEnable вместо AdlibRegister.

Добавил полноценную поддержку 3.3.0.0, WinActive раньше не возвращала hWnd, теперь это учитывается.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
похоже, что теперь работает. но заметил вот что:
запускаю exe-файл, он стартует примерно с 8,688 KB потребляемой памяти (загрузка ЦП - в норме)

и если запустить/активировать проводник, то мгновенно эти 8,688 начинают беспрерывно расти (где-то раз в секунду чётко на 8 KB, изредка - чуть более чем на 8 KB)
рост происходит только при активном проводнике, если переключиться на другое приложение, то рост сразу приостанавливается; как только вернуть фокус проводнику - рост с той же скоростью возобновляется

на 8 KB растёт, если ничего не происходит; если выделяются объекты - растёт на 32 KB примерно каждую секунду
наверное, это не самая значимая проблема, но всё же не хотелось бы наблюдать подобное поведение. не знаю, может быть, стóит прописать, чтобы программа сама перезапускалась, к примеру, после каждого часа работы. или есть более толковый способ убрать эту "прожорливость"?

уточнения:
запоминаются последние выделения объектов для каждой папки, пока в log-файле не будут записаны 20,000 блоков вида: [1], [2], [3]?
затем старые блоки будут по одному замещаться новыми?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
если запустить/активировать проводник, то мгновенно эти 8,688 начинают беспрерывно расти
Добавил высвобождение памяти.

запоминаются последние выделения объектов для каждой папки, пока в log-файле не будут записаны 20,000 блоков вида: [1], [2], [3]?
затем старые блоки будут по одному замещаться новыми?
Не по одному, удаляется первая половина при достижений максимальной величины массива (переменная $iLogItems_Cache).

В скрипте отделён блок для пользовательских настроек (#Region User Settings).
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Добавил высвобождение памяти.
беспрерывный рост прекратился; объём потребляемой памяти существенно снизился (примерно до 750 KB), причём любопытно, что это происходит при активном проводнике, а вот если он становится неактивным, то потребление мгновенно делает скачок и превышает 1000 KB

всё это просто наблюдения, а вот что несколько беспокоит, так это ежесекундное изменение объёма потребляемой памяти. из более чем 40 других процессов ни один себя так не ведёт, разве что один из двух avp.exe довольно часто меняет свои KB, а так всё более-менее статично

если не ошибаюсь, это происходит из-за $iMonitor_Selection_Interval = 500
может быть, изменить 500 на какие-нибудь 10,000? что тогда изменится конкретно для пользователя? пострадает ли качество работы программы? и будут ли ощущаться какие-либо изменения вообще? если нет, то почему не поставить хоть 100,000,000?

удаляется первая половина при достижений максимальной величины массива (переменная $iLogItems_Cache)
максимальная величина массива сейчас установлена в 20,000. это значит 20,000 символов? или строк? или 20,000 блоков вида: [1], [2], [3]?

(в архиве со скриптом лежит WinAPIEx.au3. нужно ли мне что-то с ним делать?)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
из более чем 40 других процессов ни один себя так не ведёт
Видимо не один из них не делает того что делает этот ;) Это цена за постоянный мониторинг.

пострадает ли качество работы программы?
Да, каждые 500 мс запускается функция слежения за выделением, чем режже она будет вызываться, тем режже программа будет запоминать выделение.

максимальная величина массива сейчас установлена в 20,000. это значит 20,000 символов? или строк? или 20,000 блоков вида: [1], [2], [3]?
Последнее.

в архиве со скриптом лежит WinAPIEx.au3. нужно ли мне что-то с ним делать?
Это библиотека которая содержит функцию высвобождения памяти.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey
Нашёл как это сделать без постоянного слежения...
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Видимо не один из них не делает того что делает этот ;) Это цена за постоянный мониторинг.
просто приведу в пример хотя бы процесс CRFileMonSvr.exe (принадлежит замечательной программе CenvoRox File Monitor 3.2.4) - следит за любым (copy, rename, move, delete, modify) действием над любым файлом/папкой и записывает в свою базу, посмотреть которую можно, запустив CRFileMonGUI.exe - куда уж более монитористее :smile:

из наблюдений. были выделены 932 папки, попытка восстановить выделение не удалась:
Код:
AutoIt Error
 Line -1:
 Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded
(размер лога при этом - 69,9 KB)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
из наблюдений. были выделены 932 папки, попытка восстановить выделение не удалась
Мда, забыл написать, есть ограничение в записях ini, каждая строка около 32 kb.

Хотелось бы посмотреть на это сообщение от нескомпилированного скрипта, который также покажет и номер строки.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Код:
AutoIt Error
Line 228  (File "C:\z\z.au3"):

If ControlListView($aSel_Log[$i][$ih_Explrr], "", "SysListView321", "GetText", $aSel_Indexes[$j]) = $aSel_Names[$j] Then
If ControlListView($aSel_Log[$i][$ih_Explrr], "", "SysListView321", "GetText", $aSel_Indexes[$j]) = ^ ERROR

Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey
Не получается воспроизвести это.

В любом случае, вот новая версия. Теперь слежение за выделением выполняется за счёт системного хука (реагирование на событие).
Также убрал ограничение с Ini-записей.

P.S
Нужно потестить, у меня естественно всё работает без проблем :smile:
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
проверил выделение с примерно 3,500 объектов. восстанавливается только 2,500 с небольшим, результат этот был получен дважды, причём даже это неполное восстановление длилось минуты две (!) - вначале довольно шустро (секунд за 15 выделилась первая тысяча), далее - всё медленнее и медленнее. при этом загрузка ЦП на процессе explorer.exe выросла с 0% до где-то 50% и держалась, пока шло выделение

количество объектов около 1000 выделяется корректно, но со скоростью - примерно тоже самое

вопрос такой возник:
а использование лога обязательно? я о нём упоминал в сáмом начале всего лишь как о возможном варианте, но реально ли всё организовать вообще без него? то есть, тогда программа будет беспрерывно загружена и в случае снятия выделения нажать нужно будет только ctrl + shift + R. спрашиваю, поскольку ещё с сáмого начáла отметил ощутимое неудобство - аж 3 комбинации клавиш приходится нажимать, чтобы восстановить выделение (ctrl + shift + Q, свою назначенную комбинацию (загружающую программу снова), ctrl + shift + R), а в последние часы случайно заметил, что выделение восстанавливается даже если никакого лога ещё не создавалось и программа ещё ни разу не выгружалась :shok:

с другой стороны, думаю, что log может быть довольно полезен. например, для случаев, когда нужно дать команду запомнить выделение в какой-то папке, чтобы вернуться к нему хоть на следующий день. и этих папок ведь может быть не один десяток

(вот если бы был реален вариант с логом, но и с возможностью обходиться только одной комбинацией клавиш - ctrl + shift + R)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alexey [?]
проверил выделение с примерно 3,500 объектов. восстанавливается только 2,500 с небольшим
Опять же, не получается воспроизвести это. Да и не представляю себе зачем восстанавливать выделение такого количества объектов.

использование лога обязательно? я о нём упоминал в сáмом начале всего лишь как о возможном варианте, но реально ли всё организовать вообще без него?
Нет, не обязательно.

тогда программа будет беспрерывно загружена и в случае снятия выделения нажать нужно будет только ctrl + shift + R
Нет никакой связи между восстановлением выделения и созданием лога. Лог это своего рода кеш памяти, чтобы при следующем запуске программы считывались данные о выделенных объектах в разных папках.
См. выше.
 
Верх