Что нового

[Окна, Диалоги] автоматическое скрытие выбранных расширений при добавлении torrent-файла

Alexey

Новичок
Сообщения
171
Репутация
0
Версия AutoIt: 3.3.0.0 (при необходимости могу установить 3.3.12.0)

Описание: имеется µTorrent (1.6.1). с 2008 в него было добавлено почти 29000 torrent-файлов, из которых более 99,5% - музыка. в музыкальных раздачах практически всегда наличествуют бесполезные, мусорные для меня файлы. например: log, jpg, jpeg, png, gif, bmp, m3u, m3u8, sfv, md5, txt, nfo, avi...
файлы с подобными расширениями я не скачиваю никогда, но снимать галочки с них приходится всегда. это колоссальная потеря времени, внимания, нервов, а также неимоверное количество лишних кликов и скролов (если просуммировать ВСЕ добавления torrent-файлов)

в идеале, нужен скрипт, который при запущенной программе µTorrent отслеживал бы появление её под-окна "Добавить торрент" (класс окна - #32770) и автоматически скрывал (и одновременно снимал галочки) те строки, которые содержат файлы с теми самыми ненужными расширениями
хорошо бы иметь возможность в какой-то настройке скрипта пополнять список расширений без перекомпилирования скрипта, но это далеко не самое главное

вчера мне впервые удалось хотя бы немного полазить по внутренностям файла uTorrent.exe. он занимает 173 КБ (в таком виде программой Restorator 2007 ничего толком не открывалось). но с помощью программы Unpacker PECompact (1.2.1) файл uTorrent.exe был распакован до размера 456 КБ, и тогда уже в рестораторе появилась возможность кое-что исследовать:
класс - SysListView32, ID - 1206, стиль - дочернее, видимое


в общем, вот пример добавления torrent-файла в программу µTorrent: в раздаче 4 файла (flac, sfv, jpg, txt), из которых sfv, jpg и txt автоматически не должны не то что закачиваться, но даже отображаться


Примечания: у меня сложилось впечатление, что никто проблему решить не в состоянии (разработчики не хотят, программисты/хакеры не могут). в общем, на этот форум у меня (без преувеличения) последняя надежда
прошу не предлагать вариант "не глядя закачивать всё, а затем удалять поиском ненужное", поскольку иногда этого ненужного (в одной раздаче) набегает 500 МБ, а то и более; да и мусор разводить я не привык

вот это, возможно, как-то поможет тем, кто возьмётся помочь:
autoitscript.com, uTorrent, SysListView32
autoit-script.ru, авто-проставление галок
autoitscript.com, list-view
autoitscript.com, SysListview32
programmersforum.ru, несколько вопросов по SysListView32
cyberforum.ru, как написать свой элемент управления на основе существующего

причина последнего редактирования:
частичное восстановление данного сообщения автором после постороннего, самовольного, принесшего ошибки вмешательства, осуществлённого спустя 361 день после создания темы (Garrett, прошу не решать за меня, как мне формулировать мысли и отображать предложения, поскольку в программировании я не разбираюсь, а в лингвистике очень даже, и если начну всерьёз выискивать ошибки или что-то подобное в чужих сообщениях, то мало не покажется)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Казалось простой задачей, получить текст первой колонки, сравнить расширение и снять если не подходит, но..
Ни ControlListView ни _GUICtrlListView_GetItemText не могут получить текст именно из первой. Хотя вторая, там где размер, читается.. Не понятно в чем дело.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
inververs, благодарю за попытку помочь
есть ли идеи у остальных людей, хорошо разбирающихся в AutoIt'е?

уточнение по моей версии - µTorrent (1.6.1, build 490)
[uTorrent v1.6.1 build 490: PEiD, RDG Packer Detector: PECompact 2.x -> Jeremy Collake, PECompact v2.5x - v2.7x]

может быть, информация отсюда что-то даст:
http://forum.kodi.tv/showthread.php?tid=166269
https://exelab.ru/f/index.php?action=vthread&forum=2&topic=9705&page=0
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
в одной из предоставленных ссылок имеется строка:

$hListview = ControlGetHandle("µTorrent 2.0.2", "", "[CLASS:SysListView32; INSTANCE:2]")

она никак не может помочь получить тот самый текст первой колонки?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Alexey
В первой же ссылке, список которых вы указали в описании темы, в сообщении #8 Valik объясняет, что это ВИРТУАЛЬНЫЙ список. Никакими стандартными средствами этот список не прочитать. Из нестандартных - это поиск пикселя/картинки, OCR, чтение памяти процесса. Всё это трудоёмко и требует специфических знаний.
 
Автор
A

Alexey

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

и этот урезанный вид тоже приходится терпеть почти 7 лет. Только потому что создатели не удосужились позаботиться о таком элементарном нюансе как запоминание ширины столбцов. А названия файлов постоянно превышают не то что 100 или 200 символов, а и все 260 (из-за этого бывали случаи, что файлы просто не скачивались - в системе же имеется всем известное ограничение на длину пути)

так вот от безысходности у меня с этим урезанием пару лет назад дело в итоге дошло до извращения - пришлось создать крошечный auto-hot-key-скрипт (и повесить на него горячую клавишу):
#NoTrayIcon
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0
Click 352, 197, 2
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот смотри, я сделал скрипт, который отметит галочки только на тех пунктах, размер файлов который лежит в заданных пределах от 10 до 30 мегабайт. Это конечно не решение проблемы, но очень близко к ней.
Код:
Opt('WinTitleMatchMode', 2)
ControlClick("Добавить новый торрент", "", '[CLASS:Button; INSTANCE:11]') ;Кнопка Снять выбор
ControlCommand ("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', 'Check' ); Что бы в конце отправился без проблем SPACE
$count = ControlListView("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', 'GetItemCount')

For $item = 0 To $count - 1
	$column_text = ControlListView("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', 'GetText', $item, 1)
	$mb = column_text_to_megabytes($column_text)
	;Отметим те, что больше 10 но меньше 30 мегабайт (включая)
	If $mb >= 10 And $mb <= 30 Then
		ControlListView("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', 'Select', $item)
	EndIf
Next
;Для всех отмеченных отправим пробел
ControlSend("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', '{SPACE}')

Func column_text_to_megabytes($column_text)
	Local $param = 1
	Select
		Case StringInStr($column_text, 'МБ')
			$param = 1
		Case StringInStr($column_text, 'КБ')
			$param = 1024
		Case StringInStr($column_text, 'Б')
			$param = 1024 * 1024
	EndSelect
	Return Round(Number($column_text) / $param, 1)
EndFunc   ;==>column_text_to_megabytes



Добавлено:
Сообщение автоматически объединено:

Если такой способ подходит, то удалить все остальные можно так: Инвертируем выделение и удаляем строки.
Вместо
Код:
ControlSend("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', '{SPACE}')
напиши это.
Код:
;А так можно удалять все, которые не отмечены
#include <GuiListView.au3>
ControlListView("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]', 'SelectInvert')
$hWnd = ControlGetHandle("Добавить новый торрент", "", '[CLASS:SysListView32; INSTANCE:1]')
_GUICtrlListView_DeleteItemsSelected ( $hWnd )



Добавлено:
Сообщение автоматически объединено:

С удалением проблема. Визуально остаются нужные, но если начать из отмечать, то появляются те пункты, которые были на этих местах до удаления. Облом. ;D
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
inververs, искренне благодарю за отзывчивость. К сожалению, данный скрипт мне будет даже менее удобен чем тот вынужденный, мало что упрощающий вариант, лет 5-6 назад мной созданный. Имею в виду макрос (для программы "Actual window manager"), срабатывающий при появлении окна "Добавить торрент":

<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab><Home><Ctrl+Right><Ctrl+Right><Shift+End><Ctrl+->

среди прочих мелких (и важных для меня) удобств макрос снимает все галочки (и только затем я вижу само окно); проще всё-таки выделять то немногое нужное среди кучи мусора, чем снимать галочки с ненужного. Это абсолютно не решение проблемы, конечно, но хотя бы микроскопическое облегчение

а скрипт, ориентирующийся на размер файлов не подходит по разным существенным причинам. Например, к счастью, постоянно попадаются альбомы в образах (1 flac + 1 cue). Соответственно, текстовый cue-файл всегда занимает очень мало места (1-2 КВ, а то и меньше), а в подобных случаях не скачивать его нельзя. К тому же нередко бывают flac-файлы размером меньше 10 МВ, да даже меньше 1 МВ встречаются (больше 30 МВ тоже, в том числе и больше 130 МВ)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alexey,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Код:
#NoTrayIcon
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0
Click 352, 197, 2

проблема по-прежнему очень актуальна
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
только что мне попалась очень милая бесплатная портативная программа Torrent File Editor (0.2.1) (с открытым исходным кодом)

в отличие от другого очень известного приложения BEncode Editor, в ней мне даже удалось сходу успешно удалить 1 ненужный файл - он перестал отображаться в окне программы u-torrent
больше одного файла удалить пока не получается почему-то (u-torrent пишет "invalid torrent file")

пишу всё это в расчёте на то, что, может быть, это как-то поспособствует решению всей данной темы

на всякий случай вот ещё такую ссылку упомяну:
http://superuser.com/questions/483285/how-to-edit-the-list-of-files-to-download-in-a-torrent-file
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Alexey [?]
даже удалось сходу успешно удалить 1 ненужный файл - он перестал отображаться в окне программы u-torrent
Торрент при этом нормально скачивался? Я тоже могу чуть ли не за 5 минут написать программу, которая будет удалять ненужные файлы и при этом файл успешно загрузится в µTorrent, только при скачивании возникнут сложности... Причиной тому два препятствия. Физически торрент делится не на файлы, а не части, контрольная сумма каждой хранится в торрент-файле. Корректно выпилить файлы не получится. Также подсчитывается контрольная сумма секции Info файла и используется как идентификатор торрента в сети, т. е. изменение хоть одного бита в секции Info приведет к тому что идентификатор поменяется и торрент не будет найден, или вообще будет качаться совсем другой торрент, а поскольку контрольная сумма частей не совпадет, то по факту ничего не скачается.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Prog, я только что проверил - к сожалению, не скачивается

про хэш (и проблемы с этим связанные) я ранее немного читал, но понадеялся, что существует способ это обойти. например, в ссылке из моего прошлого сообщения как раз говорится на эту тему:
the question is whether we can change the infohash without having those files with us? If we can generate a hash only for those files we selected, our job is pretty much done. Does the infohash work that way? Can we do that is the real question
 

Litoy

Новичок
Сообщения
5
Репутация
1
Получилось сделать примерно то, что вам нужно, использовал версию 3.3.12.0.
Как пользоваться:
[list type=decimal]
[*]Создаёте файлик filter_ext.txt в папке со скриптом / скомпилированным скриптом, в нём пишите построчно расширения файлов, которые будут исключены из списка
[*]Запускаете скрипт
[*]Добавляете любой торрент файл в uTorrent - Скрипт удаляет из списка отфильтрованные файлы[/list]

Принцип работы:
[list type=decimal]
[*]При запуске скрипт ждёт процесс "utorrent.exe"
[*]При активном процессе uTorrent'а скрипт ожидает появление окна "Добавить новый торрент"
[*]Как только появилось это окно - скрипт читает файл с фильтром и чистит список файлов по фильтру
[*]Ставите/снимаете нужные галочки, жмёте OK / Enter - окно закрывается, скрытые в списке файлы не загружаются
[*]Скрипт завершает работу при завершении процесса "utorrent.exe"[/list]

Некоторые особенности:
  • Стандартная кнопка OK деактивируется, создаётся "летающая" кнопка OK поверх этого окна (за основу взят скрипт от CreatoR)
  • Действительно, при убирании файлов из списка нарушается порядок установки галочек и т.п. - это решено тем, что перед закрытием окна список возвращается в изначальное состояние, но все нужные галочки будут убраны (это практически незаметно)

Код:
;AutoIt Version: 3.3.12.0

#include <WindowsConstants.au3>
#include <GuiListView.au3>

Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)
Opt("TrayIconHide", 1)

Global Const $AddTorrentDialogWindow = "[Class:#32770;RegExpTitle:([Aa]dd\s*[Nn]ew\s*[Tt]orrent\s*|[Дд]обав[^\s]+\s*[Нн]ов[^\s]+\s*[Тт]ор[^\s]+\s*)]"
Global Const $idListView = "[CLASS:SysListView32; INSTANCE:1]"
Global Const $processName = "utorrent.exe"
Global Const $bOKinAddNewTorrentWindow = "Button10"
Global Const $FilterFilePath = @ScriptDir & "\filter_ext.txt"

Global $hButton_GUI, $idButton
Global $aOld_ParentPos = -1, $hParent, $hOld_Parent, $hListView
Global $aFilterExt, $aFileList

Global $bWorking = False
Global $bActivate = False

HotKeySet("{ENTER}","_onEnter")

While ProcessWait($processName)
   $bWorking = True
   WinWait($AddTorrentDialogWindow)
   If WinActive($AddTorrentDialogWindow) Then $bActivate = True
   $hParent = WinGetHandle($AddTorrentDialogWindow)
   ;
   If Not IsHWnd($hButton_GUI) Then _ButtonCreate_Proc()
   AdlibRegister("_AdLib_ButtonFollow_Proc", 1)
   ;Working with fresh opened window
   $aFilterExt = _GenFilterArrayFromFile($FilterFilePath)
   $hListView = ControlGetHandle($hParent, "", $idListView)
   ControlDisable($AddTorrentDialogWindow, "", $bOKinAddNewTorrentWindow)
   $aFileList = _GenArrayFromListView($hParent)
   _DeleteFilteredItems($aFileList, $aFilterExt)
   If $bActivate Then
	  WinActivate($AddTorrentDialogWindow)
	  $bActivate = False
   EndIf
   ;
   While WinExists($AddTorrentDialogWindow)
	  Sleep(100)
   WEnd
   If Not ProcessExists($processName) Then Exit
WEnd

Func _ButtonCreate_Proc()
   $hButton_GUI = GUICreate("", 75, 23, -1, -1, $WS_POPUP, $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
   $idButton = GUICtrlCreateButton("OK", 0, 0, 75, 23)
   GUICtrlSetOnEvent(-1, "_Button_Event")
   ;
   GUISetState(@SW_SHOW, $hButton_GUI)
EndFunc   ;==>_ButtonCreate_Proc

Func _AdLib_ButtonFollow_Proc()
   Local $iBorder_SizeX, $iBorder_SizeYh, $iX, $iY
   ;Hiding floating button
   If (Not ProcessExists($processName)) And $bWorking Then Exit
   If $hParent <> -1 And Not WinExists($hParent) Then
	  GUISetState(@SW_HIDE, $hButton_GUI)
	  $hParent = -1
   ElseIf $hParent = -1 And WinExists($AddTorrentDialogWindow) Then
	  GUISetState(@SW_SHOW, $hButton_GUI)
	  $hParent = WinGetHandle($AddTorrentDialogWindow)
   ElseIf $hParent = -1 Then
	  Return
   EndIf
   ;
   $aParentPos = WinGetPos($hParent)
   $aParentClientSize = WinGetClientSize($hParent)
   If Not IsArray($aParentPos) Then Return
   ;
   If Not WinActive($hParent) And Not WinActive($hButton_GUI) Then
	  $aParentPos[0] = -3200
	  $aParentPos[1] = -3200
   EndIf
   ;Calculate floating button position
   If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Or $aOld_ParentPos[2] <> $aParentPos[2] Then
	  $aOld_ParentPos = $aParentPos
	  $iBorder_SizeX = ($aParentPos[2] - $aParentClientSize[0]) / 2
	  $iBorder_SizeYh = ($aParentPos[3] - $aParentClientSize[1]) - $iBorder_SizeX
	  ;
	  $aButtonRelativePos = ControlGetPos($hParent, "", $bOKinAddNewTorrentWindow)
	  $iX = ($aParentPos[0] + $aButtonRelativePos[0]) + $iBorder_SizeX
	  $iY = ($aParentPos[1] + $aButtonRelativePos[1]) + $iBorder_SizeYh
	  ;Moving floating button
	  WinMove($hButton_GUI, "", $iX, $iY)
   EndIf
EndFunc   ;==>_AdLib_ButtonFollow_Proc

Func _Button_Event()
   _UpdateListSelectionInArray($hParent, $aFileList)
   _UpdateListViewFromArray($aFileList)
   ControlClick($AddTorrentDialogWindow, "", $bOKinAddNewTorrentWindow, "main")
EndFunc   ;==>_Button_Event

Func _onEnter()
   If WinActive($AddTorrentDialogWindow) And StringCompare(StringLeft(ControlGetFocus($AddTorrentDialogWindow, ""), 6), "Button") Then
	  _Button_Event()
   Else
	  HotKeySet("{ENTER}")
	  Send("{ENTER}")
	  HotKeySet("{ENTER}","_OnEnter")
   EndIf
EndFunc   ;==>_onEnter()

#Region Functions to work with ListView and Filters
Func _GenFilterArrayFromFile($sFileName)
   Local $aArray = FileReadToArray($sFileName)
   If Not IsArray($aArray) Then Exit
   Return $aArray
EndFunc   ;==>_GenFilterArrayFromFile

Func _GenArrayFromListView($hWnd)
   Local $aArray[ControlListView($hWnd, "", $idListView, "GetItemCount")][3]
   ;0 - file name, 1 - file size (as in ListView), 2 - checked / deleted state (0 - checked, 1 - unchecked, 2 - deleted)
   For $i = 0 To UBound($aArray) - 1
	  $aArray[$i][0] = ControlListView($hWnd, "", $idListView, "GetText", $i, 0)
	  $aArray[$i][1] = ControlListView($hWnd, "", $idListView, "GetText", $i, 1)
	  $aArray[$i][2] = (_GUICtrlListView_GetItemChecked($hListView, $i)) ? 0 : 1
   Next
   ;
   Return $aArray
EndFunc   ;==>_GenArrayFromListView

Func _DeleteFilteredItems(ByRef $aFilename, ByRef $aFilterExt)
   Local $aFiltered[1][3]	; 0 - index, 1 - file name, 2 - file size
   Local $i, $j
   ; Filter by array with extensions
   For $i = 0 To UBound($aFilename) - 1
	  For $j = 0 To UBound($aFilterExt) - 1
		 If StringCompare(StringRight($aFilename[$i][0], StringLen($aFilterExt[$j]) + 1), "." & $aFilterExt[$j]) = 0 Then
			$aFilename[$i][2] = 2
			ExitLoop
		 EndIf
	  Next
   Next
   ; Deleting items in ListView
   _GUICtrlListView_BeginUpdate($hListView)
   For $i = UBound($aFilename) - 1 To 0 Step -1
	  If $aFilename[$i][2] = 2 Then _GUICtrlListView_DeleteItem($hListView, $i)
   Next
   _GUICtrlListView_EndUpdate($hListView)
EndFunc   ;==>_DeleteFilteredItems

Func _UpdateListViewFromArray(ByRef $aItemList)
   Local $newIndex = 0
   ;
   _GUICtrlListView_BeginUpdate($hListView)
   _GUICtrlListView_DeleteAllItems($hListView)
   For $i = 0 To UBound($aItemList) - 1
	  $newIndex = _GUICtrlListView_AddItem($hListView, $aItemList[$i][0])
	  _GUICtrlListView_AddSubItem($hListView, $newIndex, $aItemList[$i][1], 1)
	  If $aItemList[$i][2] = 0 Then _GUICtrlListView_SetItemChecked($hListView, $newIndex, True)
   Next
   _GUICtrlListView_EndUpdate($hListView)
EndFunc   ;==>_UpdateListViewFromArray

Func _UpdateListSelectionInArray($hWnd, ByRef $aArray)
   Local $sFind = ""
   Local $VisibleLines = ControlListView($hWnd, "", $idListView, "GetItemCount")
   If $VisibleLines = 0 Then Return
   ;
   Local $k = 0
   For $i = 0 To $VisibleLines - 1
	  $sFind = ControlListView($hWnd, "", $idListView, "GetText", $i, 0)
	  For $j = $k To UBound($aArray)
		 If StringCompare($aArray[$j][0], $sFind) = 0 Then
			$aArray[$j][2] = (_GUICtrlListView_GetItemChecked($hListView, $i)) ? 0 : 1
			$k = $j
			ExitLoop
		 EndIf
	  Next
   Next
   ;
   Return
EndFunc   ;==>_UpdateListSelectionInArray
#EndRegion
 
Автор
A

Alexey

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

1) впервые за лет 7 вроде бы появилось реальное решение проблемы (ненужные расширения не видны в списке)

2) стандартная кнопка "ок" таки деактивируется, но тут же этот негативный эффект пропадает, если просто активировать окно с галочками

3!) "летающая" кнопка "ок" поверх этого окна тоже действительно мелькает, причём всегда в разных местах экрана, и это довольно неприятно
можно ли её сделать полностью прозрачной? или сдвинуть за пределы экрана? или уменьшить размеры в пикселях до 1х1 (и тоже сдвинуть, например, в самый левый нижний край)?

вообще-то, многое из подобных действий я мог бы попытаться осуществить сам (в программе actual window manager)
но мне тогда необходимо знать параметры этой "летающей" кнопки (наверное, они всё же имеются) - сам я не успеваю за пол-секунды их вычислить:
класс окна; заголовок окна; название программы (здесь, скорее всего, подойдёт title-of-script.exe)


4) скрипт привносит сбивающую с толку неправильную индикацию размера файлов (в том числе выделенных)
(имеется в виду только одна строка - над зоной с галочками)
но это ничтожная проблема по сравнению с основной, на решение которой скрипт и направлен

5) ещё перед первой проверкой я на всякий случай в строке 11 убрал вот эти символы:
Код:
[Нн]ов[^\s]+\s*

ведь дочернее окно называется "Добавить торрент", а не "Добавить новый торрент"


ДОБАВЛЕНО ПОЗДНЕЕ:
я чуть лучше разобрался в работе скрипта и понял, что уменьшение размера до 1х1 (или сдвигание за пределы экрана) "летающей" кнопки не имеют смысла

однако вариант сделать её полностью прозрачной всё же, наверное, является очень неплохим
потому что мелькание "летающей" кнопки выглядит настолько плохо, что я вынужден был заменить в скрипте значения 75 и 23 на 0 и 0:

было:
Код:
$hButton_GUI = GUICreate("", 75, 23, -1, -1, $WS_POPUP, $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
   $idButton = GUICtrlCreateButton("OK", 0, 0, 75, 23)

стало:
Код:
$hButton_GUI = GUICreate("", 0, 0, -1, -1, $WS_POPUP, $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
   $idButton = GUICtrlCreateButton("OK", 0, 0, 0, 0)

большой положительный результат заключается в полном отсутствии мелькания, а небольшой отрицательный - кнопка "ок" не работает (вместо неё нужно нажимать одну из двух кнопок "enter")
но если бы удалось добавить кнопке "ок" полную прозрачность, то, возможно, мелькание было бы всё так же незаметно, а кнопка нажималась (пусть при этом она и выглядела бы как неактивная)

отсюда я попробовал добавить в скрипт эти 3 части:
- всю саму функцию
- все строки #include
- строку из абзаца "; BUTTON"
Код:
_GuiCtrlMakeTrans(-1,100)

но в моём исполнении это ничего не дало

но самым серьёзным негативным нюансом является другое мелькание - после нажатия на кнопку "ок"/"enter" зона с галочками в течение полусекунды начинает отображать все строки, в том числе и ранее скрывавшиеся
 
A

Alofa

Гость
OffTopic:
Alexey сказал(а):
... впервые за лет 7 вроде бы появилось реальное решение
СЕМЬ ЛЕТ?! Семь долгих лет?..
Alexey, вы демонстрируете просто чудеса "стойкости" перед соблазном изучения документации. :shok:
Семь лет назад я лично даже и не подозревал о существовании Autoit.


Однако вот и мой вклад в эту долгоиграющую тему:
Код:
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <Misc.au3>

Global $hWnd, $sINIFile = @ScriptDir & '\uTFilter.ini', $sTitle = '[CLASS:#32770;REGEXPTITLE:(Добав([А-яЁё]|\h)+?торр?ент)|(Add New Torrent)]'
Global $sLVCntrl = '[CLASS:SysListView32; INSTANCE:1]', $sButtOK = '[CLASS:Button; ID:20]'

HotKeySet('{ESC}', '_Exit') ; Выход из скрипта при нажатии 'ESC'

$sINIParam = IniRead($sINIFile, 'Filter', 'Extension', False)
If Not $sINIParam Then Exit MsgBox(16, @ScriptName, '"uTFilter.ini" не найден!')
While 1
	$hWnd = WinActivate($sTitle)
	If $hWnd Then
		$hLVCntrl = ControlGetHandle($hWnd, '', $sLVCntrl)
		$iCount = ControlListView($hWnd, '', $hLVCntrl, 'GetItemCount') - 1
		Dim $aLVItems[$iCount + 1]
		_GUICtrlListView_BeginUpdate($hLVCntrl)
		_GUICtrlListView_InsertColumn($hLVCntrl, 1, 'Расширение', 80)
		For $i = 0 To $iCount
			$sText = ControlListView($hWnd, '', $hLVCntrl, 'GetText', $i, 0)
			If StringRegExp($sText, '(?i)\.(' & $sINIParam & ')$') Then
				$aLVItems[$i] = ''
				_GUICtrlListView_SetItemChecked($hLVCntrl, $i, False)
			Else
				$aLVItems[$i] = $sText
				If Not _GUICtrlListView_GetItemChecked($hLVCntrl, $i) Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i, True)
				_GUICtrlListView_SetItemText($hLVCntrl, $i, StringUpper(StringRegExpReplace($sText, '.+(\..*?)$', '${1}')), 1)
			EndIf
		Next
		For $i = $iCount To 0 Step -1
			If Not $aLVItems[$i] Then _GUICtrlListView_DeleteItem($hLVCntrl, $i)
		Next
		_GUICtrlListView_EndUpdate($hLVCntrl)
		If Not _MyButton() Then ContinueLoop
		For $i = 0 To $iCount
			If $aLVItems[$i] And Not _GUICtrlListView_GetItemChecked($hLVCntrl, _GUICtrlListView_FindText($hLVCntrl, $aLVItems[$i])) Then $aLVItems[$i] = ''
		Next
		_GUICtrlListView_DeleteAllItems($hLVCntrl)
		For $i = 0 To $iCount
			_GUICtrlListView_AddItem($hLVCntrl, $aLVItems[$i])
			If $aLVItems[$i] Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i)
		Next
		ControlShow($hWnd, '', $sButtOK)
		ControlFocus($hWnd, '', $sButtOK)
		ControlClick($hWnd, '', $sButtOK)
		If Not WinWaitClose($hWnd, '', 3) Then WinClose($hWnd)
	Else
		Sleep(250)
	EndIf
WEnd

Func _MyButton()
	Local $aiPos, $iPosPrevX, $iPosPrevY, $hButton, $aWndList
	$aiPos = ControlGetPos($hWnd, '', $sButtOK)
	If @error Then Return 0
	$iPosPrevX = $aiPos[0]
	$iPosPrevY = $aiPos[1]
	$hButton = _GUICtrlButton_Create($hWnd, 'OK', $aiPos[0], $aiPos[1], $aiPos[2], $aiPos[3])
	ControlHide($hWnd, '', $sButtOK)
	ControlDisable($hWnd, '', $sButtOK)
	ControlFocus($hWnd, '', $hButton)
	While Sleep(10)
		If Not WinExists($hWnd) Then Return 0
		$aWndList = WinList($sTitle)
		If $aWndList[0][0] > 1 Then
			WinClose($aWndList[1][1])
			SoundPlay(@WindowsDir & '\media\Windows Ding.wav')
			WinActivate($hWnd)
		EndIf
		If _GUICtrlButton_GetState($hButton) = 0x0026C Then ExitLoop
		If WinActive($hWnd) And _IsPressed('0D') Then ExitLoop
		$aiPos = ControlGetPos($hWnd, '', $sButtOK)
		If @error Then Return 0
		If $iPosPrevX <> $aiPos[0] Or $iPosPrevY <> $aiPos[1] Then ControlMove($hWnd, '', $hButton, $aiPos[0], $aiPos[1])
	WEnd
	WinSetState($hWnd, '', @SW_HIDE)
	Return (_GUICtrlButton_Destroy($hButton)) ? 1 : 0
EndFunc   ;==>_MyButton

Func _Exit()
	If $hWnd Then WinClose($hWnd)
	Exit
EndFunc   ;==>_Exit

Этот скрипт берет свое начало из другой вашей темы (спасибо Garrett).
Принцип работы аналогичен скрипту от Litoy, только подходы к решению немного разные.

Основные моменты:
- Необходимо создать в каталоге скрипта документ "uTFilter.ini" с примерно следующим содержанием:
Код:
[Filter]
Extension = mp3|htm|png|jpeg
... в котором вы указываете НЕнужные расширения, через разделитель "|";
- в "ListView" отлавливаемого окна добавляется еще одна колонка - "Расширение";
- Выход из скрипта при нажатии кнопки "ESC".
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Alofa
в этом варианте скрипт ведёт себя корректней (в отличие от удалённого минут 50 назад, где не запоминался выбор файлов среди разрешённых расширений - все файлы закачивались)

не получается пока понять, медленнее ли запускается окно "Добавить торрент". в первые минуты казалось, что со скриптом тупит где-то 1 (или 1,5) лишнюю секунду, но сейчас я в этом не очень уверен

почему-то после нажатия на кнопку ок/enter главное окно µTorrent'а уходит на задний фон (оно не сворачивается, но и не становится активным, как должно. фокус уходит в проводник, из которого я перетаскивал torrent-файл)
такого безобидного, но большого глюка ещё не приходилось наблюдать

для работы скрипта колонка "расширения" обязательна? спрашиваю, поскольку мне она точно никак не нужна

можно ли сделать без кнопки esc (а как было у Litoy)?: "скрипт завершает работу при завершении процесса utorrent.exe"

ДОБАВЛЕНО ПОЗДНЕЕ:
перетаскивание из проводника ни при чём - если других развёрнутых окон нет, то главное окно µTorrent'а остаётся видимым, но теряет фокус

у меня в системе прописан макрос, выполняемый при запуске окна "Добавить торрент" (ещё до его отрисовки):
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab><Home><Ctrl+Right><Ctrl+Right><Shift+End><Ctrl+->
без скриптов из этой темы макрос без проблем выполняется с задержкой в 0,1 секунды (так у него в настройках мной назначено)

я сравнил поведение скрипта №2 (от Alofa) с вариантом №1 (от Litoy):
в №1 макрос выполняется частично (что тоже плохо), в №2 - вообще никак

выяснилось, что:
в №2 нажатия на кнопку tab (или shift+tab), дойдя до кнопки ок, перестают приводить к перемещению фокуса и он застревает на кнопке ок
в №1 фокус перескакивает неактивную кнопку ок

это серьёзная проблема. реально ли её устранить?
если нет, то я мог бы попробовать перейти на компромиссный вариант (не особо хороший), выкинув все табы:
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab>

но даже так в №2 ничего не улучшается, поскольку окно "Добавить торрент" после запуска не получает фокуса ни в верхней строке (там указывается путь для скачивания), ни где либо ещё
без скриптов фокус автоматически ставится в эту строку
(если в неё щёлкнуть мышкой, то тогда фокус появляется, но это совсем не то)

а вот в №1 этот компромисс работает хорошо

можно попросить этот ужас ("media\Windows Ding.wav") корректно и полностью убрать?
№2 лишён почти всех недостатков, присущих номеру 1, но проблема с макросом очень не радует
 
A

Alofa

Гость
Alexey сказал(а):
... у меня в системе прописан макрос, выполняемый при запуске окна "Добавить торрент" ...
Что это вообще такое и чего вы этим добиваетесь?
Если подробно опишите, то возможно объеденим два скрипта в один.
("макрос" - пожалуйста называйте вещи своими именами)

Alexey сказал(а):
... можно попросить этот ужас ("media\Windows Ding.wav") корректно и полностью убрать? ...
Этот ужас срабатывает когда вы пытаетесь открыть еще одно подобное окно. Второе окно принудительно закрывается, чтобы дать возможность скрипту доработать с первым.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Alofa, с 2009 называю "это" словом "макрос" только потому что сами разработчики потрясающей программы "actual window manager" употребляют такой термин. в настройках это выглядит как "запустить клавиатурный макрос"

полный вид:
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab><Home><Ctrl+Right><Ctrl+Right><Shift+End><Ctrl+->

часть 1:
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab>
восполняет нереализованную в программе µTorrent функцию "при добавлении torrent-файла автоматически снимать выделение со всех галочек"
это удобно, когда torrent-файл "содержит" много файлов (например, в дискографиях). да и во многих других случаях мне так лучше
первые 7 <Tab> - это переключения фокуса от верхней строки (где указывается путь для скачивания) к кнопке "снять метки"
<Space> - нажатие на эту кнопку
следующие 5 <Tab> - возвращение к верхней строке

часть 2:
<Home><Ctrl+Right><Ctrl+Right><Shift+End>
это стандартная клавиша + стандартные сочетания клавиш
необходимо лично мне, поскольку позволяет удобно без дополнительных кликов и нажатий на клавиши сразу после появления окна печатать нужное мне название каталога, в который будет производиться скачивание (у меня названия всегда состоят из трёх цифр, например, 476). при этом путь перед названием каталога всегда будет одинаков, что тоже удобно мне

часть 3:
<Ctrl+->
это специальная мной назначенная (в программе actual window manager) комбинация клавиш для функции "сделать полупрозрачным"
дело в том, что для окна "Добавить торрент" в правилах данной программы я указал "сделать полупрозрачным - 100% (невидимое)". указал, потому что мне так нужно
и вот для того чтобы окно снова было видимым, <Ctrl+-> нажимается автоматически

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

Alofa

Гость
Уточнение, на сколько я вас правильно понял:
- Часть 1: вы хотите видеть все отфильтрованные файлы со снятыми галочками;
- Часть 2: сразу при появлении окна фокус необходимо направить в адресную строку;
- Часть 3: при запуске ваше окно прозрачно - <Ctrl+-> - и вот уже видим.
 
Верх