Что нового

многократная отправка в буфер обмена названий большого количества файлов

Alexey

Новичок
Сообщения
171
Репутация
0
Версия AutoIt: 3.3.0.0

Описание:
1) в окно программы я перетаскиваю какое-то количество файлов (как правило, это будет 30-60)
2) программа по очереди отсылает в буфер обмена название каждого файла (без расширений и без точки перед расширением), начиная с последнего

Примечания:
это всё пригодится для упрощения добавления заданий в программу u-torrent
скрипт для меня имеет смысл в том числе и потому, что в процесс добавления заданий будет активно вовлечена утилита для работы с буфером обмена CLCL
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Alexey сказал(а):
программа по очереди отсылает в буфер обмена название каждого файла (без расширений и без точки перед расширением), начиная с последнего

Что значит по очереди? С каким-то интервлом или как?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Примерно так:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <Array.au3>

Global Const $WM_DROPFILES = 0x233

Global $aDroppedFiles[1]
Global $aIncludeFilesMask = StringSplit(".torrent", "|") ;Разрешённые расширения файлов
Global $iShowInvalidExtsMessage = 1 ;Показывать сообщение о неподдерживаемых расширении файлов
Global $iClipPutInterval = 1000 ;Время ожидания (в миллисекундах) между отправкой файла в буфер обмена

$hGUI = GUICreate("Drop Files GUI", 500, 400, -1, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

GUICtrlCreateLabel('', 0, 0, 500, 400)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

GUISetState()

While 1
    $Msg = GUIGetMsg()
	
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_DROPPED
			$sNotValidExtPath = ""
			
			_ArraySort($aDroppedFiles, 1, 1)
			
			For $i = 1 To UBound($aDroppedFiles)-1
				If _DroppedFileIsValidExt($aDroppedFiles[$i]) Then
					ClipPut(StringRegExpReplace($aDroppedFiles[$i], '^.*\\|\.[^\.]*$', ''))
					
					If $iClipPutInterval Then
						Sleep($iClipPutInterval)
					EndIf
				Else
					$sNotValidExtPath &= $aDroppedFiles[$i] & @CRLF
				EndIf
			Next
			
			If $iShowInvalidExtsMessage And $sNotValidExtPath <> "" Then
				MsgBox(262144+48, "Attention!", "You dropped file(s) with non valid extension/attribute:" & @CRLF & @CRLF & $sNotValidExtPath, 0, $hGUI)
			EndIf
    EndSwitch
WEnd

Func _DroppedFileIsValidExt($sPath)
	For $i = 1 To $aIncludeFilesMask[0]
		If StringRegExp($sPath, '(?i)\Q' & $aIncludeFilesMask[$i] & '\E$') Or StringInStr(FileGetAttrib($sPath), $aIncludeFilesMask[$i]) Then
			Return True
		EndIf
	Next
	
	Return False
EndFunc

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
	Local $nSize, $pFileName
	Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
	
	$aDroppedFiles = 0
	Dim $aDroppedFiles[$nAmt[0]+1]
	
	For $i = 0 To $nAmt[0] - 1
		$nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
		$nSize = $nSize[0] + 1
		$pFileName = DllStructCreate("char[" & $nSize & "]")
        
		DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
		
		$aDroppedFiles[0] += 1
		
		$aDroppedFiles[$aDroppedFiles[0]] = DllStructGetData($pFileName, 1)
		$pFileName = 0
	Next
	
	ReDim $aDroppedFiles[$aDroppedFiles[0]+1]
EndFunc



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

Alexey [?]
это всё пригодится для упрощения добавления заданий в программу u-torrent
Я уверен что можно найти метод управления этой программой по проще.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
623
OffTopic:
CreatoR [?]
Я уверен что можно найти метод управления этой программой по проще.
к сожалению, utorrent не предоставляет COM-интерфейс для взаимодействия
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Kaster [?]
к сожалению, utorrent не предоставляет COM-интерфейс для взаимодействия
Я не говорил про COM.
У uTorrent кроме доступного WebAPI/UI и поддержки командной строки, имеется довольно простой интерфейс, и можно получить доступ почти ко всем его элементам.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR сказал(а):
странно, но при первой же попытке добавить несколько файлов с расширением .torrent пишет "You dropped file(s) with non valid extension/attribute"

Yashied сказал(а):
Что значит по очереди? С каким-то интервлом или как?
имеется в виду, что скрипт вместо меня должен пройти все названия и каждое из них одно за другим отправлять в буфер обмена. так же, как если бы это я нажимал на последнем файле F2, затем - CTRL+C, ESC, UP, F2, CTRL+C...
только скорость у скрипта, естественно, должна быть мгновенной

CreatoR сказал(а):
Я уверен что можно найти метод управления этой программой по проще.
из стандартных средств управления незамысловатый u-torrent предоставляет далеко не всё, что требуется для комфортной работы. поэтому приходиться идти на всякие ухищрения, чтобы хоть в каких-то моментах упростить использование u-torrent'а
в частности, при запуске окнá "Добавить Торрэнт" у меня происходит автоматическая вставка содержимого бýфера обмена чётко в нужное поле (задействована баснословно полезная программа Actual-Window-Manager)

CreatoR сказал(а):
У uTorrent ... имеется довольно простой интерфейс, и можно получить доступ почти ко всем его элементам.
раз уж такое дело, спрошу на всякий случай. есть огромная необходимость сделать так, чтобы в окне с содержимым торрэнт-файла перестали отображаться файлы определённых расширений. эту мечту реально осуществить ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Alexey [?]
при первой же попытке добавить несколько файлов с расширением .torrent пишет "You dropped file(s) with non valid extension/attribute"
Сорри, поправил.

есть огромная необходимость сделать так, чтобы в окне с содержимым торрэнт-файла перестали отображаться файлы определённых расширений
Это свойство (опция) поддерживается самим uTorrent?
Я бы потестил это дело, uTorrent есть, но что мне нужно сделать чтобы воспроизвести подобную ситуацию (для тестирования)?
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
CreatoR сказал(а):
Сорри, поправил.
в буфер теперь добавляется. но в работе скрипта заметил некоторые моменты, которые хотелось бы поменять:

1) вместе с названием копируется и путь каждого файла. но путей быть не должно
2) названия файлов добавляются с первого по последний. должно быть наоборот

3) названия файлов отправляются в буфер жутко медленно, где-то по 2 штуки за секунду. пережить можно, но ощутимо огорчает. это исправимо ?
4) можно ли изменить окно скрипта так, чтобы в нём не было ничего вообще ? - ни надписи "Drag to the ListView some file(s)", ни области со столбцами Сol1, Сol2, Сol3, ни самогó списка названий

CreatoR сказал(а):
Это свойство (опция) поддерживается самим uTorrent?
в том-то и дело, что не поддерживается никак. необходимо самомý каждый раз смотреть на список с файлами и вручную десятки/сотни галочек ставить/убирать
данная деятельность не представляет никакой трудности для тех, кто делает это пару раз за пару дней, но для меня давно назрела острейшая необходимость автоматизировать этот процесс
есть целый ряд форматов, которые я при закачке всегда, при любых обстоятельствах игнорирую, поэтому и хочется их даже не видеть нигде, а просто знать, что они, вероятно, есть, но галочки с них автоматически ужé были сняты

CreatoR сказал(а):
Я бы потестил это дело, uTorrent есть, но что мне нужно сделать чтобы воспроизвести подобную ситуацию (для тестирования)?
честно, не знаю. u-torrent ничего такого не предлагает. единственное, с чем слегка похожим сталкивался - в подобной проге "vuze" есть в настройках пункт, предлагающий перечислить список форматов, которые будут исключены из создаваемого торрэнта. как-то так - я не особо в ней разбирался, поскольку искал в её опциях пункт, предлагающий перечислить список форматов, которые не будут отбражаться в окне содержимого торрэнт-файла. но именно такого там тоже не было
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Alexey [?]
вместе с названием копируется и путь каждого файла. но путей быть не должно
Ок, поправил.

названия файлов добавляются с первого по последний. должно быть наоборот
Странно, цикл же с конца перебирает файлы...

названия файлов отправляются в буфер жутко медленно, где-то по 2 штуки за секунду
Ну так там специально добавлена пауза, она устанавливается в переменной $iClipPutInterval - можно выставить на 0 чтобы паузы небыло вовсе.

можно ли изменить окно скрипта так, чтобы в нём не было ничего вообще ? - ни надписи "Drag to the ListView some file(s)", ни области со столбцами Сol1, Сol2, Сol3, ни самогó списка названий
Ок.

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

честно, не знаю. u-torrent ничего такого не предлагает
Я к тому что мне нужно воспроизвести то что видите вы, чтобы я знал что конкретно требуется. Т.е как мне отобразить диалог где нужно что то делать?
 
Автор
A

Alexey

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

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

Ну так там специально добавлена пауза, она устанавливается в переменной $iClipPutInterval - можно выставить на 0 чтобы паузы небыло вовсе
вместо 1000 попробовал 100 - работает всё ещё надёжно, но не так быстро, как хотелось бы; при значении 10 - очень быстро (именно как надо), но результат не приемлемый (значительный процент названий не добавился вообще); при 0 - по сути, не работает никак (добавляется только одно название, какое бы количество я не выбирал); в итоге вернулся на 100

Ну значит поддерживается, значит можно автомтизировать эти галочки. Вы видимо меня не понимаете.
автоматизировать их хоть как-то (макрос нажатия клавиш) я и сам смог давно - при открытии окнá "с галочками" помимо автоматической вставки из буфера у меня сделано так, что все галочки сами снимаются со всех строк
нужно же убрать с пóля зрения сами стрóки, в которых есть нежелательные для меня расширения (к примеру, .log, .jpg, .m3u...)

Я к тому что мне нужно воспроизвести то что видите вы, чтобы я знал что конкретно требуется. Т.е как мне отобразить диалог где нужно что то делать?
скачать какой-нибудь torrent-файл; открыть u-torrent (у меня версия 1.61); нажать "открыть torrent" (ctrl+O); появится окно "Добавить торрент" с содержимым torrent-файла
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Alexey [?]
может, попробовать поставить наоборот, с начáла?
А может для начала стоило паопробовать мой обновлённый скрипт? я там так и сделал ;)


в идеале желательно, чтобы вне зависимости от того, за какóй из выделенных файлов я хватаюсь курсором и перетаскиваю группу файлов, всегда названия добавлялись от последнего по первое
А как определить какой файл должен быть первым? по каким критериям сортировать список файлов?

10 - очень быстро (именно как надо), но результат не приемлемый (значительный процент названий не добавился вообще)
Потому что буфер обмена (а точнее программа которая с ним работает) не обрабатывает информацию так быстро.

качать какой-нибудь torrent-файл; открыть u-torrent (у меня версия 1.61); нажать "открыть torrent" (ctrl+O); появится окно "Добавить торрент" с содержимым torrent-файла
Попробую.
 
Автор
A

Alexey

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

А как определить какой файл должен быть первым? по каким критериям сортировать список файлов?
по алфавиту, начиная с последнего
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Alexey [?]
ты всерьёз полагаешь, что я сначала отвечаю, а только потóм пробую обновлённый скрипт?
В этом случае да, и ничего удивительного тут нет, был на то повод:
[?]
может, попробовать поставить наоборот, с начáла?
это было написано после того как я изменил порядок цикла в скрипте.

[?]
по алфавиту, начиная с последнего
Можно добавить _ArraySort перед циклом.

По поводу проблемы добавления имён при небольшой паузе - а что если их добавлять не по одному, а все сразу, одним заходом?
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Можно добавить _ArraySort перед циклом
давай попробуем, всё равно ведь пока что при любом варианте названия добавлялись с первого по последнее
По поводу проблемы добавления имён при небольшой паузе - а что если их добавлять не по одному, а все сразу, одним заходом?
при этом в буфер они как будут помещаться ? если списком, то это совсем не то
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Может я чего-то пропустил, но как вообще будет осуществляться синхронизация добавления-чтения информации из буфера обмена? Полагаться на некий интервал (задержку), это крайне неправильный подход.

Alexey сказал(а):
...программа по очереди отсылает в буфер обмена название каждого файла...

А что дальше будет происходить? Каким образом (какая программа) будет брать эту информацию из буфера обмена? Как мы можем написать код для заполнения буфера обмена, не зная принципа работы программы приемника.


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

Все, что здесь насоветано, это топтание на месте. Alexey, опиши пожалуйста весь процесс (от и до) добавления файлов в uTorrent.
 
Автор
A

Alexey

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Alexey сказал(а):
первое сообщение этой темы содержит ответ

Если речь идет о CLCL, то я не знаю как она работает. Она может удалять данные из буфера, после того, как прочла их?
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Yashied сказал(а):
опиши пожалуйста весь процесс (от и до) добавления файлов в uTorrent.
так вроде ужé описывал. вот ещё раз чуть подробнее:

скачать какой-нибудь torrent-файл
открыть u-torrent (у меня версия 1.61)
нажать "открыть torrent" (ctrl+O)
найти скачанный torrent-файл и выбрать его
появится окно "Добавить торрент" с содержимым torrent-файла
отмечаем галочками нужные файлы

Yashied сказал(а):
Если речь идет о CLCL, то я не знаю как она работает. Она может удалять данные из буфера, после того, как прочла их?
в её настройках есть пункт "удалять из журнала, если объект скопирован в буфер обмена". но у меня он не активирован. мне и нужно, чтобы она какие-либо данные удаляла. новые пункты буфера обмена в моём случае просто заменяют самые старые
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Вообщем суть в том, что тебе каким-нибудь образом нужно получить подтверждение о том, что очередное название файла было прочитано из буфера обмена. И только после этого посылать в буфер следующие данные. В этом случае ты избавишься от всех ошибок и получишь максимальную скорость.


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

Alexey сказал(а):
...вот ещё раз чуть подробнее:

Это я знаю, я имел в виду работу вокруг буфера обмена.
 
Верх