Что нового

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

Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
- часть 1: в идеале бы оставить ту возможность, которая была все эти годы
то есть, захотелось мне, чтобы галочки снимались - я использую макрос в полном его варианте
а если я решу, что не нужно, чтобы они снимались - я быстро вручную убираю вот это:
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab>

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

может как вариант добавить настройку (если это возможно) в скриптовый ини-файл? типа такой: "untick all visible files - true/false"

- часть 2: да, сразу при появлении окна фокус необходимо направить в адресную строку

- часть 3: да, при запуске окно прозрачно. <Ctrl+-> - и вот уже видим
 
A

Alofa

Гость
Вот попробовал воплотить пожелания:
Код:
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <Misc.au3>

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

Global $vINIParam = IniReadSection($sINIFile, 'Filter')
If @error Then Exit MsgBox(16, @ScriptName, 'Ошибка чтения "uTFilter.ini"!')
If $vINIParam[3][1] Then
	HotKeySet($vINIParam[3][1], '_CBStateSwitch')
	$vINIParam[3][1] = True
EndIf

While ProcessExists($Process)
	$hWnd = WinActivate($sTitle)
	If $hWnd Then
		$hTimer = TimerInit()
		If $vINIParam[4][1] Then WinSetTrans($hWnd, '', $vINIParam[4][1])
		$hLVCntrl = ControlGetHandle($hWnd, '', $sLVCntrl)
		$iCount = ControlListView($hWnd, '', $hLVCntrl, 'GetItemCount') - 1
		Dim $aLVItems[$iCount + 1]
		_GUICtrlListView_BeginUpdate($hLVCntrl)
		If $vINIParam[2][1] == 0 Then _GUICtrlListView_SetItemChecked($hLVCntrl, -1, False)
		For $i = $iCount To 0 Step -1
			$sText = ControlListView($hWnd, '', $hLVCntrl, 'GetText', $i, 0)
			If StringRegExp($sText, '(?i)\.(' & $vINIParam[1][1] & ')$') Then
				$aLVItems[$i] = ''
				_GUICtrlListView_DeleteItem($hLVCntrl, $i)
			Else
				$aLVItems[$i] = $sText
			EndIf
		Next
		_GUICtrlListView_EndUpdate($hLVCntrl)
		$hButtOK = ControlGetHandle($hWnd, '', $sButtOK)
		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_BeginUpdate($hLVCntrl)
		_GUICtrlListView_DeleteAllItems($hLVCntrl)
		For $i = 0 To $iCount
			_GUICtrlListView_AddItem($hLVCntrl, $aLVItems[$i])
			If $aLVItems[$i] Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i)
		Next
		ControlFocus($hWnd, '', $hButtOK)
		ControlClick($hWnd, '', $hButtOK)
		If Not WinWaitClose($hWnd, '', 3) Then WinClose($hWnd)
	Else
		Sleep(200)
	EndIf
WEnd

Func _MyButton()
	Local $aiPos, $sControl, $iPosPrevX, $iPosPrevY, $hButton, $aWndList
	$aiPos = ControlGetPos($hWnd, '', $hButtOK)
	$sControl = ControlGetFocus($hWnd)
	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, '', $hButtOK)
	ControlDisable($hWnd, '', $hButtOK)
	ControlFocus($hWnd, '', $sControl)
	While Sleep(10)
		If Not WinExists($hWnd) Then Return 0
		$aWndList = WinList($sTitle)
		If $aWndList[0][0] > 1 Then
			WinClose($aWndList[1][1])
			WinActivate($hWnd)
		EndIf
		If _GUICtrlButton_GetState($hButton) = 0x0026C Then ExitLoop
		If WinActive($hWnd) And _IsPressed('0D') Then ExitLoop
		$aiPos = ControlGetPos($hWnd, '', $hButtOK)
		If @error Then Return 0
		If $iPosPrevX <> $aiPos[0] Or $iPosPrevY <> $aiPos[1] Then ControlMove($hWnd, '', $hButton, $aiPos[0], $aiPos[1])
	WEnd
	Return ControlEnable($hWnd, '', $hButtOK)
EndFunc   ;==>_MyButton

Func _CBStateSwitch()
	If Not WinActive($hWnd) Then Return
	$vINIParam[3][1] = Not $vINIParam[3][1]
	_GUICtrlListView_SetItemChecked($hLVCntrl, -1, $vINIParam[3][1])
EndFunc   ;==>_CBStateSwitch

Что изменилось:
- Ну прежде всего файл "uTFilter.ini" . В него добавились новые параметры:
Главное соблюсти порядок следования параметров (коментарии можете из файла удалить).
[box title=uTFilter.ini][Filter]
; Фильтр НЕнужных расширений:
Extension = mp3|png|jpg|jpeg
; Регистр не учитывается

; Состояние галочек по умолчанию:
; ("0" - снять выделение для всех пунктов)

CBState = 1
; Если значение не "0" или не указано, то функция снятия галочек применена не будет.

; Переключатель галочек по сочетанию клавиш:
; (в данном случае "Alt+F1")

CBStateSwitch = !{F1}
; Необходимо соблюдать синтаксис написания как для функции "Send()"
; Если значение не указано, то функция горячих клавиш применена не будет.

; Прозрачность для окна при открытии:
; (255 = непрозрачно, 0 = полная прозрачность)

Transparency = 255
; Если значение не указано, то функция прозрачности применена не будет.[/box]

Alexey сказал(а):
полный вид:
<Tab><Tab><Tab><Tab><Tab><Tab><Tab><Space><Tab><Tab><Tab><Tab><Tab><Home><Ctrl+Right><Ctrl+Right><Shift+End><Ctrl+->
Это надо будет отключить.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
в макросе я вынужденно оставил: <Home><Ctrl+Right><Ctrl+Right><Shift+End>
так как обязательно нужно, чтобы эти 4 действия выполнялись (что они корректно и делают). да и для скрипта, как я понял, это не помеха

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

проблема 2:
до последнего обновления скрипта было так:
A) после нажатия на кнопку ок/enter (в окне "Добавить торрент") главное окно µTorrent'а не получает немедленно фокус, а сразу оказывается на заднем фоне
то есть, фокус получает окно другой программы, из которой был добавлен torrent-файл

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

вариант В для меня неприемлем. хорошо было бы настроить скрипт или на стандартное поведение программы µTorrent:
после нажатия на кнопку ок/enter главное окно µTorrent'а немедленно получает фокус
или вернуть вариант А
я не сразу сообразил, но мне он с большой вероятностью даже будет более удобен, чем стандартный вариант, всегда мной использовавшийся

но если это реально, то можно и добавить настройку в ини-файл, в которой дать выбор из двух действий
 
A

Alofa

Гость
Alexey сказал(а):
в макросе я вынужденно оставил: <Home><Ctrl+Right><Ctrl+Right><Shift+End>
Это все делается в настройках µTorrent'а (так, к сведению).
382210dd116e908c8dcfefaa13563d56.png

Alexey сказал(а):
... теперь при прогрузке окна "Добавить торрент" успеваю увидеть как фильтруется список.
Ничего, не смертельно ;D

Alexey сказал(а):
... реально ли прописать в скрипте, чтобы окно отображалось через, допустим, 0,1 секунды после фильтрации расширений?
Сигналом к действию скрипта является факт появления нужного окна, т.е. когда оно уже отрисовано. А теперь попробуйте сами ответить на свой вопрос.


Короче, обновил скрипт в Ответе #21 и комментарии в "uTFilter.ini".
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
насчёт второй проблемы из моего прошлого сообщения. всё-таки прошу вернуть вариант А:
после нажатия на кнопку ок/enter (в окне "Добавить торрент") фокус получает не главное окно µTorrent'а, а окно программы, из которой был добавлен torrent-файл

в этом варианте (двухдневной давности) происходило как надо:
Код:
#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, 'Расширение', -1)
        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

а в этом варианте (он же самый последний) фокус получает главное окно µTorrent'а:
Код:
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <Misc.au3>

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

Global $vINIParam = IniReadSection($sINIFile, 'Filter')
If @error Then Exit MsgBox(16, @ScriptName, 'Ошибка чтения "uTFilter.ini"!')
If $vINIParam[3][1] Then
    HotKeySet($vINIParam[3][1], '_CBStateSwitch')
    $vINIParam[3][1] = True
EndIf

While ProcessExists($Process)
    $hWnd = WinActivate($sTitle)
    If $hWnd Then
        $hTimer = TimerInit()
        If $vINIParam[4][1] Then WinSetTrans($hWnd, '', $vINIParam[4][1])
        $hLVCntrl = ControlGetHandle($hWnd, '', $sLVCntrl)
        $iCount = ControlListView($hWnd, '', $hLVCntrl, 'GetItemCount') - 1
        Dim $aLVItems[$iCount + 1]
        _GUICtrlListView_BeginUpdate($hLVCntrl)
        If $vINIParam[2][1] == 0 Then _GUICtrlListView_SetItemChecked($hLVCntrl, -1, False)
        For $i = $iCount To 0 Step -1
            $sText = ControlListView($hWnd, '', $hLVCntrl, 'GetText', $i, 0)
            If StringRegExp($sText, '(?i)\.(' & $vINIParam[1][1] & ')$') Then
                $aLVItems[$i] = ''
                _GUICtrlListView_DeleteItem($hLVCntrl, $i)
            Else
                $aLVItems[$i] = $sText
            EndIf
        Next
        _GUICtrlListView_EndUpdate($hLVCntrl)
        $hButtOK = ControlGetHandle($hWnd, '', $sButtOK)
        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_BeginUpdate($hLVCntrl)
        _GUICtrlListView_DeleteAllItems($hLVCntrl)
        For $i = 0 To $iCount
            _GUICtrlListView_AddItem($hLVCntrl, $aLVItems[$i])
            If $aLVItems[$i] Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i)
        Next
        ControlFocus($hWnd, '', $hButtOK)
        ControlClick($hWnd, '', $hButtOK)
        If Not WinWaitClose($hWnd, '', 3) Then WinClose($hWnd)
    Else
        Sleep(200)
    EndIf
WEnd

Func _MyButton()
    Local $aiPos, $sControl, $iPosPrevX, $iPosPrevY, $hButton, $aWndList
    $aiPos = ControlGetPos($hWnd, '', $hButtOK)
    $sControl = ControlGetFocus($hWnd)
    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, '', $hButtOK)
    ControlDisable($hWnd, '', $hButtOK)
    ControlFocus($hWnd, '', $sControl)
    While Sleep(10)
        If Not WinExists($hWnd) Then Return 0
        $aWndList = WinList($sTitle)
        If $aWndList[0][0] > 1 Then
            WinClose($aWndList[1][1])
            WinActivate($hWnd)
        EndIf
        If _GUICtrlButton_GetState($hButton) = 0x0026C Then ExitLoop
        If WinActive($hWnd) And _IsPressed('0D') Then ExitLoop
        $aiPos = ControlGetPos($hWnd, '', $hButtOK)
        If @error Then Return 0
        If $iPosPrevX <> $aiPos[0] Or $iPosPrevY <> $aiPos[1] Then ControlMove($hWnd, '', $hButton, $aiPos[0], $aiPos[1])
    WEnd
    Return ControlEnable($hWnd, '', $hButtOK)
EndFunc   ;==>_MyButton

Func _CBStateSwitch()
    If Not WinActive($hWnd) Then Return
    $vINIParam[3][1] = Not $vINIParam[3][1]
    _GUICtrlListView_SetItemChecked($hLVCntrl, -1, $vINIParam[3][1])
EndFunc   ;==>_CBStateSwitch

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

Alofa

Гость
Alexey
О Батенька, да я смотрю, вам не угодишь :stars:
"Хочу то, хочу это"...
Короче, Я ПАСС. :dance_man:
(и это еще мягко сказано)

P.s: Зарание разрешаю любому дорабатывать и/или извращаться над моим кодом.
 
Автор
A

Alexey

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

я вот сам пытаюсь сравнить 2 варианта скрипта, чтобы понять, как вернуть его поведение так, чтобы фокус как и пару дней назад направлялся в проводник/браузер, а не в главное окно µTorrent'а, но у меня ничего не получается

ну при чём тут "не угодишь"?


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

1) не имея должных знаний, я сам попытался методом тыка добиться, чтобы фокус направлялся в браузер, но безуспешно:
Код:
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <Misc.au3>

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

Global $vINIParam = IniReadSection($sINIFile, 'Filter')
If @error Then Exit MsgBox(16, @ScriptName, 'Ошибка чтения "uTFilter.ini"!')
If $vINIParam[3][1] Then
    HotKeySet($vINIParam[3][1], '_CBStateSwitch')
    $vINIParam[3][1] = True
EndIf

While ProcessExists($Process)
    $hWnd = WinActivate($sTitle)
    $hWndFF = WinActivate($sTitle2)
    If $hWnd Then
        $hTimer = TimerInit()
        If $vINIParam[4][1] Then WinSetTrans($hWnd, '', $vINIParam[4][1])
        $hLVCntrl = ControlGetHandle($hWnd, '', $sLVCntrl)
        $iCount = ControlListView($hWnd, '', $hLVCntrl, 'GetItemCount') - 1
        Dim $aLVItems[$iCount + 1]
        _GUICtrlListView_BeginUpdate($hLVCntrl)
        If $vINIParam[2][1] == 0 Then _GUICtrlListView_SetItemChecked($hLVCntrl, -1, False)
        For $i = $iCount To 0 Step -1
            $sText = ControlListView($hWnd, '', $hLVCntrl, 'GetText', $i, 0)
            If StringRegExp($sText, '(?i)\.(' & $vINIParam[1][1] & ')$') Then
                $aLVItems[$i] = ''
                _GUICtrlListView_DeleteItem($hLVCntrl, $i)
            Else
                $aLVItems[$i] = $sText
            EndIf
        Next
        _GUICtrlListView_EndUpdate($hLVCntrl)
        $hButtOK = ControlGetHandle($hWnd, '', $sButtOK)
        If Not _MyButton() Then ContinueLoop
        $hWinProcess = _WinAPI_GetParent($hWndFF)
        For $i = 0 To $iCount
            If $aLVItems[$i] And Not _GUICtrlListView_GetItemChecked($hLVCntrl, _GUICtrlListView_FindText($hLVCntrl, $aLVItems[$i])) Then $aLVItems[$i] = ''
        Next
        _GUICtrlListView_BeginUpdate($hLVCntrl)
        _GUICtrlListView_DeleteAllItems($hLVCntrl)
        For $i = 0 To $iCount
            _GUICtrlListView_AddItem($hLVCntrl, $aLVItems[$i])
            If $aLVItems[$i] Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i)
        Next
        ControlFocus($hWnd, '', $hButtOK)
        ControlClick($hWnd, '', $hButtOK)
        If Not WinWaitClose($hWnd, '', 3) Then WinClose($hWnd)
        WinActivate($hWinProcess)
    Else
        Sleep(200)
    EndIf
WEnd

Func _MyButton()
    Local $aiPos, $sControl, $iPosPrevX, $iPosPrevY, $hButton, $aWndList
    $aiPos = ControlGetPos($hWnd, '', $hButtOK)
    $sControl = ControlGetFocus($hWnd)
    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, '', $hButtOK)
    ControlDisable($hWnd, '', $hButtOK)
    ControlFocus($hWnd, '', $sControl)
    While Sleep(10)
        If Not WinExists($hWnd) Then Return 0
        $aWndList = WinList($sTitle)
        If $aWndList[0][0] > 1 Then
            WinClose($aWndList[1][1])
            WinActivate($hWndFF)
        EndIf
        If _GUICtrlButton_GetState($hButton) = 0x0026C Then ExitLoop
        If WinActive($hWnd) And _IsPressed('0D') Then ExitLoop
        $aiPos = ControlGetPos($hWnd, '', $hButtOK)
        If @error Then Return 0
        If $iPosPrevX <> $aiPos[0] Or $iPosPrevY <> $aiPos[1] Then ControlMove($hWnd, '', $hButton, $aiPos[0], $aiPos[1])
    WEnd
    Return ControlEnable($hWnd, '', $hButtOK)
EndFunc   ;==>_MyButton

Func _CBStateSwitch()
    If Not WinActive($hWnd) Then Return
    $vINIParam[3][1] = Not $vINIParam[3][1]
    _GUICtrlListView_SetItemChecked($hLVCntrl, -1, $vINIParam[3][1])
EndFunc   ;==>_CBStateSwitch

2) что касается вопроса про двойной щелчок. вот мной давно созданный и работающий скрипт для программы Auto-Hot-Key (1.0.48.05):
Код:
#NoTrayIcon
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0
Click 352, 197, 2
он делает то, что нужно (дважды кликает по разделителю, который у меня всегда в одном месте экрана), но его наличие подразумевает: лишнюю программу, лишний процесс, лишнее сочетание клавиш и необходимость часто это сочетание нажимать, когда это могло бы делаться автоматически
как правильно данные 4 строки внедрить в скрипт из этой темы?

3) последняя и главная проблема на данный момент остаётся нерешённой:
каждый раз при запуске окна заметен сам процесс фильтрации расширений, что выглядит как досадное мелькание и очень серьёзно портит почти полностью готовый скрипт
 

Litoy

Новичок
Сообщения
5
Репутация
1
Alexey, я вот самого главного не понимаю: вы попросили сделать скрипт, который ставит/снимает галочки в окне "Добавить торрент", но при этом сами натравливаете совершенно другой скрипт на это же окно. В этом смысле я солидарен с Alofa, что "вам не угодишь".

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

P.S. По поводу мигания списка - убрать мигание невозможно (т.к. идёт добавление/удаление новых строк в список; их нельзя сделать скрытыми), можно пойти другими путями:
1. При нажатии "OK" прятать окно целиком (не поможет при первой обработке окна)
2. Делать список невидимым на время обновления (но тогда мигать будет сам список 1 раз)
 
A

Alofa

Гость
Alexey сказал(а):
мне не хочется по поводу этого скрипта кого-либо в дальнейшем напрягать, поэтому тестирую его в работе и пробую смириться с оставшимися (и некоторыми новыми) неудобствами - всего их набирается 5

но по самой свежей проблеме осмелюсь попросить помощи, поскольку она серьёзная, а сам я не справлюсь:
выяснилось, что отмеченные галочками файлы всё равно не закачиваются (получают приоритет "пропустить"), если в названии содержат хотя бы 1 диакритический символ. примеры:
Där Föddes En Längtan.cue
Serenità (Original Mix).flac

В скрипте замените этот цикл For...:
Код:
For $i = 0 To $iCount
	If $aLVItems[$i] And Not _GUICtrlListView_GetItemChecked($hLVCntrl, _GUICtrlListView_FindText($hLVCntrl, $aLVItems[$i])) Then $aLVItems[$i] = ''
Next


... на такой:
Код:
For $i = 0 To $iCount
	If $aLVItems[$i] Then
		$iIndex = ControlListView($hWnd, '', $hLVCntrl, 'FindItem', $aLVItems[$i])
		If Not _GUICtrlListView_GetItemChecked($hLVCntrl, $iIndex) Then $aLVItems[$i] = ''
	EndIf
Next
 
Автор
A

Alexey

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

Litoy сказал(а):
объясните, чего вы хотите окончательно добиться от скрипта
на данный момент до окончательного принятия скрипта меня отделяют следующие основные пункты:

1) в окне "Добавить торрент" после нажатия на кнопку ок/enter получает фокус либо главное окно µTorrent'а, либо программа, из которой был добавлен torrent-файл (браузер, проводник)
но вчера обнаружилось очень неудобное поведение скрипта:

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

было бы здорово как-то прописать, чтобы фокус чётко уходил либо в браузер (CLASS:#MozillaWindowClass;TITLE:Mozilla Firefox), либо в главное окно µTorrent'а (в зависимости от настройки в ини-файле)
в одном из спойлеров я выкладывал свою неудачную попытку реализовать это

возможно, если бы вот этот код
Alofa сказал(а):
; но в нашем случае лучше вообще так:
Код:
If $vINIParam[5][0] = 'FocusReturn' And $vINIParam[5][1] == 0 Then ; ...
был в законченном виде и я бы его попробовал добавить, странных нюансов с фокусом не происходило бы. но располагая только этой частью кода, проверить не имею возможности

не знаю, может быть, в каком-то таком направлении стоило бы идти:
Код:
Global $hWnd, $hWnd2, $hLVCntrl, $hButtOK
Global $sTitle2 = '[CLASS:#MozillaWindowClass;TITLE:Mozilla Firefox]'

    $hWnd2 = WinActivate($sTitle2)

    If $vINIParam[5][0] = 'FocusReturn' And $vINIParam[5][1] == 0 Then
        WinSetState($hWnd, '', @SW_HIDE)
        WinActivate($hWnd2)
    EndIf
    If $vINIParam[5][1] = 'FocusReturn' And $vINIParam[5][0] == 0 Then
        WinActivate($hWnd)
    EndIf


2) проблема с переключателем галочек по сочетанию клавиш. пример:
если в ини-файле назначить F1 на переключение галочек, то во время работы скрипта в браузере перестаёт работать F1 (давно назначенная мной на закрытие вкладки)

в скрипте используется HotKeySet. я абсолютно не уверен, но может быть замена на _HotKey_Assign стала бы решением
по-видимому, скрипт и ини-файл назначают глобальную клавишу (сочетание клавиш), а нужно не глобальную


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

Alofa

Гость
Alexey сказал(а):
... заметен сам процесс фильтрации расширений.
Это не так. Вы видите уже прцесс замены (обновление) списка результатом фильтрации.
Если хотите увидеть сам процесс фильтрации во всей красе (так сказать почувствовать разницу), то закоментируйте или удалите на время из скрипта следующие строки:
Код:
_GUICtrlListView_BeginUpdate($hLVCntrl)
; И
_GUICtrlListView_EndUpdate($hLVCntrl)
 

Litoy

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

в скрипте используется HotKeySet. я абсолютно не уверен, но может быть замена на _HotKey_Assign стала бы решением
по-видимому, скрипт и ини-файл назначают глобальную клавишу (сочетание клавиш), а нужно не глобальную
Для того, чтобы сделать HotKeySet локальным, посмотрите функцию _onEnter в моём скрипте. Там реализована проверка, что окно "Добавить торрент" является активным и в фокусе находится кнопка (а не поле ввода). В противном случае HotKeySet временно отключается:
Код:
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
 
A

Alofa

Гость
Alexey
Изменения в "uTFilter.ini":
- Изменена форма записи сочетаний клавиш;
- Добавлен еще один параметр.
[box title=uTFilter.ini][Filter]
; Фильтр НЕнужных расширений:
Extension = mp3|png|jpg|jpeg
; Регистр не учитывается

; Состояние галочек по умолчанию:
; ("0" - снять выделение для всех пунктов)

CBState = 1
; Если значение не "0" или не указано, то функция снятия галочек применена не будет.

; Переключатель галочек по сочетанию клавиш:
; (Сочетание нескольких клавиш записывается через "+". Названия клавиш стандартные)

CBStateSwitch = Alt+F1
; Если значение не указано, то функция горячих клавиш применена не будет.

; Прозрачность для окна при открытии:
; (255 = непрозрачно, 0 = полная прозрачность)

Transparency = 255
; Если значение не указано, то функция прозрачности применена не будет.

; Возвращение фокуса главному окну:
; ("0" - не возвращать фокус)

FocusReturn = 1
; Если значение не "0" или не указано, то функция заставляющая главное окно терять фокус применена не будет.

; Идентификатор окна, которому передается фокус (при "FocusReturn" = 0):
; (Форма записи, смотри: http://autoit-script.ru/autoit3_docs/intro/windowsadvanced.htm)

FocusWindowID = [CLASS:MozillaWindowClass]
; Если FocusReturn не "0" тога данный параметр игнорируется.[/box]

Код:
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <Misc.au3>

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

Global $asINIParam = IniReadSection($sINIFile, 'Filter')
If @error Then Exit MsgBox(16, 'ОШИБКА!', 'Ошибка чтения "uTFilter.ini"!')
If $asINIParam[0][0] < 6 Then Exit MsgBox(16, 'ОШИБКА!', '"uTFilter.ini" имеет НЕ полный набор параметров!')
If $asINIParam[3][0] = 'CBStateSwitch' And $asINIParam[3][1] Then
	HotKeySet(_KeyCombination(), '_CBStateSwitch')
	$asINIParam[3][0] = True
EndIf
If Not $asINIParam[6][0] = 'FocusWindowID' And Not $asINIParam[6][1] Then $asINIParam[5][0] = ''

While ProcessExists($Process)
	$hWnd = WinActivate($sTitle)
	If $hWnd Then
		$hTimer = TimerInit()
		If $asINIParam[4][0] = 'Transparency' And $asINIParam[4][1] Then WinSetTrans($hWnd, '', $asINIParam[4][1])
		$hLVCntrl = ControlGetHandle($hWnd, '', $sLVCntrl)
		$iCount = ControlListView($hWnd, '', $hLVCntrl, 'GetItemCount') - 1
		Dim $aLVItems[$iCount + 1]
		_GUICtrlListView_BeginUpdate($hLVCntrl)
		If $asINIParam[2][0] = 'CBState' And $asINIParam[2][1] == 0 Then _GUICtrlListView_SetItemChecked($hLVCntrl, -1, False)
		For $i = $iCount To 0 Step -1
			$sText = ControlListView($hWnd, '', $hLVCntrl, 'GetText', $i, 0)
			If StringRegExp($sText, '\.(?i:' & $asINIParam[1][1] & ')$') Then
				$aLVItems[$i] = ''
				_GUICtrlListView_DeleteItem($hLVCntrl, $i)
			Else
				$aLVItems[$i] = $sText
			EndIf
		Next
		_GUICtrlListView_SetColumnWidth($hLVCntrl, 0, $LVSCW_AUTOSIZE)
		_GUICtrlListView_EndUpdate($hLVCntrl)
		$hButtOK = ControlGetHandle($hWnd, '', $sButtOK)
		If Not _MyButton() Then ContinueLoop
		For $i = 0 To $iCount
			If $aLVItems[$i] Then
				$iIndex = ControlListView($hWnd, '', $hLVCntrl, 'FindItem', $aLVItems[$i])
				If Not _GUICtrlListView_GetItemChecked($hLVCntrl, $iIndex) Then $aLVItems[$i] = ''
			EndIf
		Next
		_GUICtrlListView_BeginUpdate($hLVCntrl)
		_GUICtrlListView_DeleteAllItems($hLVCntrl)
		For $i = 0 To $iCount
			_GUICtrlListView_AddItem($hLVCntrl, $aLVItems[$i])
			If $aLVItems[$i] Then _GUICtrlListView_SetItemChecked($hLVCntrl, $i)
		Next
		ControlFocus($hWnd, '', $hButtOK)
		ControlClick($hWnd, '', $hButtOK)
		If $asINIParam[5][0] = 'FocusReturn' And $asINIParam[5][1] == 0 Then WinActivate($asINIParam[6][1])
		If Not WinWaitClose($hWnd, '', 3) Then WinClose($hWnd)
	Else
		Sleep(200)
	EndIf
WEnd

Func _MyButton()
	Local $aiPos, $sControl, $iPosPrevX, $iPosPrevY, $hButton, $aWndList
	$aiPos = ControlGetPos($hWnd, '', $hButtOK)
	$sControl = ControlGetFocus($hWnd)
	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, '', $hButtOK)
	ControlDisable($hWnd, '', $hButtOK)
	ControlFocus($hWnd, '', $sControl)
	While Sleep(10)
		If Not WinExists($hWnd) Then Return 0
		$aWndList = WinList($sTitle)
		If $aWndList[0][0] > 1 Then
			WinClose($aWndList[1][1])
			WinActivate($hWnd)
		EndIf
		If _GUICtrlButton_GetState($hButton) = 0x0026C Then ExitLoop
		If WinActive($hWnd) And _IsPressed('0D') Then ExitLoop
		$aiPos = ControlGetPos($hWnd, '', $hButtOK)
		If @error Then Return 0
		If $iPosPrevX <> $aiPos[0] Or $iPosPrevY <> $aiPos[1] Then ControlMove($hWnd, '', $hButton, $aiPos[0], $aiPos[1])
	WEnd
	Return ControlEnable($hWnd, '', $hButtOK)
EndFunc   ;==>_MyButton

Func _CBStateSwitch()
	If WinActive($hWnd) Then
		$asINIParam[3][0] = Not $asINIParam[3][0]
		_GUICtrlListView_SetItemChecked($hLVCntrl, -1, $asINIParam[3][0])
	Else
		HotKeySet($asINIParam[3][1])
		Send($asINIParam[3][1])
		HotKeySet($asINIParam[3][1], '_CBStateSwitch')
	EndIf
EndFunc   ;==>_CBStateSwitch

Func _KeyCombination()
	Local $sOutput
	Local $asKeysValue[35][2] = [['}', '{}}'], ['{', '{{}'], ['Alt', '!'], ['Shift', '+'], ['Ctrl', '^'], ['Win|Windows', '#'], ['\!', '{!}'], ['\#', '{#}'], ['\+', '{+}'], _
			['\^', '{^}'], ['SPACE|SpaceBar', '{SPACE}'], ['ENTER', '{ENTER}'], ['Backspace', '{BS}'], ['Delete|Del', '{DEL}'], ['UP', '{UP}'], ['DOWN', '{DOWN}'], _
			['LEFT', '{LEFT}'], ['RIGHT', '{RIGHT}'], ['HOME', '{HOME}'], ['END', '{END}'], ['ESCAPE|ESC', '{ESC}'], ['INSERT|INS', '{INS}'], ['PageUp|PgUp', '{PGUP}'], _
			['PageDown|PgDn', '{PGDN}'], ['F(\d{1,2})', '{F${1}}'], ['TAB', '{TAB}'], ['(Print Screen)|(Prt Scr SysRq)|Prtscr', '{PRINTSCREEN}'], ['LWIN', '{LWIN}'], _
			['RWIN', '{RWIN}'], ['NumLock|(Num Lock)|(Num Lk)', '{NUMLOCK}'], ['CapsLock|(Caps Lock)|(Caps Lk)', '{CAPSLOCK}'], _
			['ScrollLock|(Scroll Lock)|(Scroll Lk)', '{SCROLLLOCK}'], ['BREAK', '{BREAK}'], ['PAUSE', '{PAUSE}'], ['SLEEP', '{SLEEP}']]
	$asKeys = StringSplit($asINIParam[3][1], '+')
	$asINIParam[3][1] = ''
	For $i = 1 To $asKeys[0]
		For $ic = 0 To 34
			$sOutput = StringRegExpReplace($asKeys[$i], '(?i)' & $asKeysValue[$ic][0], $asKeysValue[$ic][1])
			If @extended Then
				$asINIParam[3][1] &= $sOutput
				$sOutput = ''
				SetExtended(0)
				ExitLoop
			EndIf
		Next
		$asINIParam[3][1] &= $sOutput
	Next
	Return $asINIParam[3][1]
EndFunc   ;==>_KeyCombination
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
новый вариант вроде работает, но как-то странно и сбивающе с толку. если при открытом окне "Добавить торрент":

1) никаких манипуляций с другими окнами не производить, то всё нормально (после закрытия этого окна фокус идёт в браузер, который мгновенно активируется)

2) запустить какое-то окно блокнота, а затем его свернуть, то после закрытия окна "Добавить торрент":
- фокус на половину секунды идёт в это окно блокнота (но оно не активируется)
- при этом в течение половины секунды видимым является главное окно µTorrent'а
- затем фокус идёт в браузер (и он активируется)

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

4) вернуться на несколько секунд/минут в браузер, то после закрытия окна "Добавить торрент" всё происходит также как в третьем случае

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

Alofa

Гость
А если удалить ?
Код:
If $asINIParam[5][0] = 'FocusReturn' And $asINIParam[5][1] == 0 Then WinSetState($hWnd, '', @SW_HIDE)
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
строку удалил и проблемные пункты (2, 3, 4) исчезли. искренне благодарю за помощь
(с проводником ситуация не изменилась, но это терпимо)
 
Верх