Что нового

поиск разницы между версиями одного скрипта для возврата утраченной возможности

Alexey

Новичок
Сообщения
171
Репутация
0
- в браузере нажимается кнопка "скачать torrent"
- затем автоматически открывается и получает фокус дочернее окно "Добавить торрент" программы µTorrent
- после закрытия окна "Добавить торрент" фокус может быть сразу направлен либо в главное окно программы µTorrent, либо в браузер

имеются 2 версии одного скрипта. в ранней версии фокус направлялся в браузер, в поздней - в µ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

поздняя версия:
Код:
#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

не имея должных знаний, я попытался методом тыка добиться, чтобы фокус направлялся в браузер, но безуспешно:
Код:
#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
(скрипт взят из этой темы)
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
мне самому удалось добиться нужного результата, наугад добавив после строки 82
Код:
WEnd


вот эту строку
Код:
WinSetState($hWnd, '', @SW_HIDE)


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

Alofa

Гость
Alexey сказал(а):
мне самому удалось добиться нужного результата...
УУуррраааа!!!
"Упорство и труд - все перетрут". Вы все правильно сделали. :ok:
Alexey сказал(а):
... хорошо бы ещё наверняка знать, что после такого вмешательства в скрипт всё с ним будет в порядке
Все будет в полном порядке.

OffTopic:
А теперь подумайте, как в скрипте реализовать вот это:
[box title=uTFilter.ini]
[Filter]
; Фильтр НЕнужных расширений:
Extension = mp3|png|jpg|jpeg
; Регистр не учитывается

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

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

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

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

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

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

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

FocusReturn = 1
; Если значение не "0" или не указано, то функция заставляющая главное окно терять фокус применена не будет.
[/box]
Проанализируйте последний скрипт и то, как там реализована связь с ним параметров из INI файла.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
OffTopic:
как там реализована связь с ним параметров из INI файла
думал несколько десятков минут. в итоге строку 83
Код:
WinSetState($hWnd, '', @SW_HIDE)


заменил на
Код:
If $vINIParam[5][1] Then WinSetState($hWnd, '', $vINIParam[5][1])


так вроде работает. но 1 момент всё-таки смущает. если дело дойдёт до реального использования скрипта, то я, конечно, значок из области уведомлений уберу, но всё же пока что, если в ини-файле указать "FocusReturn = 0" и после возврата в браузер нажать на этот значок правой кнопкой и выбрать "exit", то фокус из браузера сам тут же переместится в µTorrent (чего однозначно происходить не должно)
 
A

Alofa

Гость
Alexey сказал(а):
заменил на
Код:
If $vINIParam[5][1] Then WinSetState($hWnd, '', $vINIParam[5][1])
Ерунда какая-то (уж извините за прямоту).
Эта строка, в вашем исполнении, звучит примерно так:
[box]Если переменной массива $vINIParam[5][1] присвоено какое-то значение (причем тут не учитывается, что вы пропишите в параметре "FocusReturn" INI файла - "0" или "1" разницы нет, или какую-нибудь букву, знак) Тогда выполняем функцию WinSetState(), третий параметр которой имеет значение данной переменной.[/box]
Почитай про функцию WinSetState(), для чего она вобще и какие аргументы должна иметь.
Для того чтобы правильно состарить условие If...Then тоже придется читать.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alofa [?]
Ерунда какая-то (уж извините за прямоту).

Если переменной массива $vINIParam[5][1] присвоено какое-то значение (причем "0" это будет или "1" без разници, или какая-нибудь буква, знак) Тогда выполняем функцию WinSetState(), третий параметр которой имеет значение данной переменной.

Alofa , конструкция If...Then это условный оператор, реализующий выполнение определённых команд при условии, что некое логическое выражение (условие) принимает значение True ("истина" или 1) но никак не ноль. Поэтому у Alexey всё логично.
 
A

Alofa

Гость
Garrett, со всем уважением, но позвольте возразить.
В нашем случае массив "$vINIParam" правильно было бы назвать вот так: "$asINIParam" (это я поторопился). Этот массив возвращается функцией "IniReadSection()".
Таким образом, подчеркиваю в данном случае, прочитанные значения из INI файла "0" или "1" это не есть булевы False или True - это есть строки.
И соответственно выражение от Alexey, для того чтобы распознать "0", должно иметь следующий вид:
Код:
If $vINIParam[5][1] = '0' Then ; ...
; или
If $vINIParam[5][1] == 0 Then ; ...

; но в нашем случае лучше вообще так:
If $vINIParam[5][0] = 'FocusReturn' And $vINIParam[5][1] == 0 Then ; ...
; (Смотрите OffTopic в Ответе #2)
 
Автор
A

Alexey

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

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

Alofa

Гость
- А в штатном режиме работы uTorrent качает?
- Дайте пример-ссылку на раздачу.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
пример:
http://rutracker.org/forum/viewtopic.php?t=5177259

из 10 flac-файлов закачиваются только №4 и №8 (в них нет диакритики)

в штатном режиме (без скрипта) закачиваются все 10 flac-файлов
 
A

Alofa

Гость
OffTopic:
Alexey
Давайте по проблемам связаным с исходным скриптом общатся в Родительской теме. Нечего тут Оффтопить.
Свои касяки я всегда готов обсудить и устранить.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
OffTopic:
хорошо, я перехожу в ту тему
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
Alofa
Если у вас будит желание, ещё раз прочитайте свой пост и следом мой, и проанализируйте их.
 
A

Alofa

Гость
OffTopic:
Garrett сказал(а):
... проанализируйте их.
Анализом только и живем.


Alofa сказал(а):
... Если переменной массива $vINIParam[5][1] присвоено какое-то значение (причем "0" это будет или "1" без ризницы, или какая-нибудь буква, знак) Тогда...
Так я пытался объяснить Alexey простыми словами суть его ошибки в составлении условия. В скобках идет речь о значениях которые могут быть прописаны в INI файле.
Да согласен, если случайный человек прочитает такое, то для него это будет дезинформацией (что-то я об этом сразу не подумал) - поэтому сейчас подправил тот пост.
Но если бы я начал сразу объяснять как вы, то боюсь человек понял бы меня буквально и начал манипулировать единицами и нулями в INI файле.

P.s::

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