1 (изменено: Androgen, 2007-05-05 18:24:54)

Тема: AutoHotkey: Управление разными плеерами (Foobar, WinAmp и другие)

Вот здесь я выкладывал скрипт по управлению WinAmp'ом. А вот тут - скрипт по управлению Foobar'ом.
Здесь я предлагаю совмещённый скрипт, позволяющий управлять этими плеерами. Работает скрипт так: если запущен какой-то один из этих плееров, то им и производится управление. Если запущены оба плеера, то управляем тем, который выбран как предпочитаемый. Предпочитаемый плеер задаётся в настройках и может быть изменён в процессе выполнения скрипта (из меню в трее). Кроме того, список управляемых плееров легко расширить (нужно только знать управляющие команды добавляемых плееров).
Скрипт можно забрать архивчиком.

;*******************************************************************************
; AutoHotkey Version:    1.0.46.06+
; Автор:                Androgen Belkin
; Имя скрипта:            MultiPlayerControl.ahk (v.1.0)
;*******************************************************************************
; Позволяет управлять плеерами WinAmp и FooBar (другие плееры легко добавить).
; Если запущен какой-то один из этих плееров, то им и будем управлять.
; Если запущены оба плеера, то управляем тем, который выбран как предпочитаемый.
; Предпочитаемый плеер задаётся в настройках и
; может быть изменён в процессе выполнения скрипта (из меню в трее).
;*******************************************************************************
;~ #NoTrayIcon            ; не отображать значок скрипта в трее
#SingleInstance force    ; перезагрузить скрипт, если он уже запущен
DetectHiddenWindows, On    ; искать в скрытых окнах (если WinAmp свёрнут)
#NoEnv                    ; запрещаем имена переменных как у переменных окружения
SendMode Input            ; режим высылки без задержки и повышенной надежности

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ============================================
; Пути к плеерам используются только для их запуска.
; Для остальных управляющих команд они не нужны.
; Если путь не указан или указан неверно, то команда запуска игнорируется.
Winamp_Path = D:\Program_2\Winamp\winamp.exe ; путь можно не указывать
Foobar_Path = D:\Program_2\Foobar\foobar2000.exe ; путь можно не указывать

;~ PreferPlayer = Winamp ; предпочтение этому плееру, если запущены оба
PreferPlayer = FooBar ; предпочтение этому плееру, если запущены оба
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ =======================================

; ========== СОЗДАНИЕ МЕНЮ В ТРЕЕ ==============================================
Menu, Tray, NoStandard ; не использовать стандартное меню
Menu, Tray, Add, Предпочтение WinAmp'у, Menu_WinAmp
Menu, Tray, Add, Предпочтение FooBar'у, Menu_FooBar
Menu, Tray, Add ; разделитель
Menu, Tray, Add, В&ыход, Exit_Script ; выйти из скрипта
; расставляем галочки
If PreferPlayer = Winamp
    Menu, Tray, Check, Предпочтение WinAmp'у ; поставить галочку в меню
If PreferPlayer = FooBar
    Menu, Tray, Check, Предпочтение FooBar'у ; поставить галочку в меню
Return ; закончить автовыполняющуюся часть
; ========== КОНЕЦ СОЗДАНИЯ МЕНЮ В ТРЕЕ ========================================

; ========== ПОДПРОГРАММЫ ДЛЯ МЕНЮ В ТРЕЕ ======================================
Menu_WinAmp: ; подпрограмма реагирования на выбор пункта меню
    Menu, Tray, Check, Предпочтение WinAmp'у ; поставить галочку в меню
    Menu, Tray, Uncheck, Предпочтение FooBar'у ; снять галочку в меню
    PreferPlayer = Winamp
Return ; конец подпрограммы

Menu_FooBar: ; подпрограмма реагирования на выбор пункта меню
    Menu, Tray, Check, Предпочтение FooBar'у ; поставить галочку в меню
    Menu, Tray, Uncheck, Предпочтение WinAmp'у ; снять галочку в меню
    PreferPlayer = FooBar
Return ; конец подпрограммы

Exit_Script:
    ExitApp ; выйти из скрипта
; ========== КОНЕЦ ПОДПРОГРАММ МЕНЮ В ТРЕЕ =====================================


; ====================== УПРАВЛЕНИЕ ПЛЕЕРАМИ ===================================
; высылать эти клавиши всегда, кроме тех случаев,
; когда они используется в горячих клавишах
$Numpad0:: Send, {Numpad0} ; высылать Numpad0
$NumpadIns:: Send, {NumpadIns} ; высылать NumpadIns


; ========== ЗАПУСТИТЬ ПЛЕЕР ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadEnter:: ; запустить плеер
Numpad0 & NumpadEnter:: ; запустить плеер
Launch_Media:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If PreferPlayer = WinAmp ; если запускать нужно WinAmp
        Run, %Winamp_Path%,, UseErrorLevel ; запустить его
    If PreferPlayer = FooBar ; если запускать нужно FooBar
        Run, %FooBar_Path%, %FooBar_Dir%, UseErrorLevel ; запустить его
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ЗАКРЫТЬ ПЛЕЕР ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadDel:: ; закрыть плеер
Numpad0 & NumpadDot:: ; закрыть плеер
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40001,,, ahk_class Winamp v1.x ; закрыть Winamp
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "exit" ) ; закрыть Foobar
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== СВЕРНУТЬ/РАЗВЕРНУТЬ ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadMult:: ; свернуть/развернуть
Numpad0 & NumpadMult:: ; свернуть/развернуть
WinAmp_Min_Restore: ; метка входа из WIN+S
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
    {
        WinGet, State, MinMax, ahk_class Winamp v1.x
        If State = -1 ; если окно минимизировано, то...
            WinActivate, ahk_class Winamp v1.x ; восстановить свернутое окно
        Else ; если окно НЕ минимизировано, то...
        {
            IfWinActive, ahk_class BaseWindow_RootWnd ; если окно активно, то...
                WinMinimize, ahk_class Winamp v1.x ; свернуть окно
            Else ; если окно НЕ активно, то...
                WinActivate, ahk_class Winamp v1.x ; окно - на передний план
        }
    }
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
    {
        WinGet, State, MinMax, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
        If State = -1 ; если окно минимизировано, то...
            FooBarControl( "show" ) ; восстановить свернутое окно
        Else ; если окно НЕ минимизировано, то...
        {
            IfWinActive, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
                FooBarControl( "hide" ) ; свернуть окно
            Else ; если окно НЕ активно, то...
                FooBarControl( "show" ) ; окно - на передний план
        }
    }
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ВОСПРОИЗВЕДЕНИЕ/ПАУЗА ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadClear:: ; воспроизведение/пауза
Numpad0 & Numpad5:: ; воспроизведение/пауза
Media_Play_Pause:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
    {
        SendMessage, 0x400,, 104,, ahk_class Winamp v1.x ; проверка режима
        ; (0=остановлен, 1=воспроизводится, 3=на паузе)
        If ErrorLevel = 0 ; если остановлен, то...
            PostMessage, 0x111, 40045,,, ahk_class Winamp v1.x ; воспроизведение
        Else ; если воспроизводится или на паузе, то...
            PostMessage, 0x111, 40046,,, ahk_class Winamp v1.x ; пауза/воспр.
    }
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "playpause" )
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ОСТАНОВИТЬ ===============
;-------------------------------------------------------------------------------
NumpadIns & NumpadEnd:: ; остановить
Numpad0 & Numpad1:: ; остановить
Media_Stop:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40047,,, ahk_class Winamp v1.x ; остановить
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "stop" ) ; остановить воспроизведение
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ПРЕДЫДУЩИЙ ТРЕК ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadLeft:: ; предыдущий трек
Numpad0 & Numpad4:: ; предыдущий трек
Media_Prev:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40044,,, ahk_class Winamp v1.x ; предыдущий трек
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "prev" ) ; предыдущий трек
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== СЛЕДУЮЩИЙ ТРЕК ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadRight:: ; следующий трек
Numpad0 & Numpad6:: ; следующий трек
Media_Next:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40048,,, ahk_class Winamp v1.x ; следующий трек
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "next" ) ; следующий трек
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== НАЗАД НА 5 СЕКУНД ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadHome:: ; назад на 5 секунд
Numpad0 & Numpad7:: ; назад на 5 секунд
^Media_Prev:: ; обработка мультимедийной клавы (CTRL+)
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40144,,, ahk_class Winamp v1.x ; назад на 5 секунд
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "command:Seek back by 5 seconds" ) ; назад на 5 секунд
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ВПЕРЕД НА 5 СЕКУНД ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadPgUp:: ; вперед на 5 секунд
Numpad0 & Numpad9:: ; вперед на 5 секунд
^Media_Next:: ; обработка мультимедийной клавы (CTRL+)
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
        PostMessage, 0x111, 40148,,, ahk_class Winamp v1.x ; вперед на 5 секунд
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
        FooBarControl( "command:Seek ahead by 5 seconds" ) ; вперед на 5 секунд
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ДИАЛОГ ОТКРЫТИЯ ФАЙЛОВ ==========
;-------------------------------------------------------------------------------
NumpadIns & NumpadDiv:: ; диалог открытия файлов
Numpad0 & NumpadDiv:: ; диалог открытия файлов
;-----------------------------------------------------------------------------
    If ( WhatPlayer() = "WinAmp" ) ; если управлять нужно WinAmp'ом
    {
        WinActivate, ahk_class Winamp v1.x ; активизировать окно
        PostMessage, 0x111, 40029,,, ahk_class Winamp v1.x ; окно открытия
    }
    If ( WhatPlayer() = "FooBar" ) ; если управлять нужно FooBar'ом
    {
        FooBarControl( "show" ) ; активизировать окно
        FooBarControl( "command:Open..." ) ; вызвать окно открытия файлов
;~         FooBarControl( "command:Load PlayList..." ) ; окно открытия плей-листов
    }
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


;-------------------------------------------------------------------------------
WhatPlayer() ; функция проверки, каким плеером нужно управлять
{
    Global PreferPlayer
    Process, Exist, foobar2000.exe ; проверяем существование процесса foobar2000
    Foo_PID := ErrorLevel ; вносим PID в переменную
    Process, Exist, winamp.exe ; проверяем существование процесса winamp
    WinAmp_PID := ErrorLevel ; вносим PID в переменную
    If Foo_PID AND WinAmp_PID ; если запущены оба плеера, то...
        Return PreferPlayer ; вернуть из функции предпочитаемый плеер
    If Foo_PID ; если запущен только foobar, то...
        Return "FooBar" ; вернуть из функции этот плеер
    If WinAmp_PID ; если запущен только Winamp, то...
        Return "WinAmp" ; вернуть из функции этот плеер
    ; если никакой из плееров не запущен, то...
    Return ; выйти из функции
} ; конец функции
;-------------------------------------------------------------------------------


;-------------------------------------------------------------------------------
FooBarControl( fooCommand ) ; функция управления foobar'ом
{
    ; В качестве параметра функция принимает параметр ком. строки foobar'а (без слеша)
    BatchLines_Before := A_BatchLines ; запоминаем текущие настройки скорости выполнения скрипта
    SetBatchLines, -1 ; указываем максимальную скорость для скрипта

    Process, Exist, foobar2000.exe ; проверяем существование процесса foobar2000
    Foo_PID := ErrorLevel ; вносим PID в переменную
    If NOT Foo_PID ; если процесс не существует, то...
        Return ; выйти из функции
    ; если процесс существует, то продолжаем...
    h_process := DllCall( "OpenProcess"            ; открываем хендл процесса (права будут нужны для GetModuleFileNameExA)
                        , "UInt", 0x10|0x400    ; с нужными правами: 0x10 = PROCESS_VM_READ, 0x400 = PROCESS_QUERY_INFORMATION
                        , "Int" , False            ; без наследования хендла
                        , "UInt", Foo_PID )        ; для указанного PID'а
    If ( ErrorLevel OR h_process = 0 ) ; если почему-либо не удалось открыть хендл (или он открыт для несуществующего PID'а)...
        Goto, fbc_Return ; перейти к закрытию хендла и выйти из функции

    VarSetCapacity( FooExePath, 255 ) ; обеспечиваем достаточную вместимость переменной (путь в символах, длиннее не бывает)
    DllCall( "psapi.dll\GetModuleFileNameExA"    ; получаем путь к исполнимому файлу процесса GetModuleFileNameExA-(ANSI)
            , "UInt", h_process                    ; для указанного хендла процесса
            , "UInt", 0                            ; нас интересует не модуль, а целиком процесс
            , "Str" , FooExePath                ; переменная, получающая путь
            , "UInt", 255 )                        ; 255 - длина извлекаемого пути в символах (длиннее не бывает)
    fbc_Return: ; метка перехода к закрытию хендла процесса
    DllCall( "CloseHandle", "UInt", h_process ) ; закрываем хендл процесса

    RunWait, %FooExePath% /"%fooCommand%" ; отправить команду foobar'у (и дождаться её выполнения)
    SetBatchLines, %BatchLines_Before% ; восстанавливаем скорость скрипта
    Return ; выйти из функции
} ; конец функции
;-------------------------------------------------------------------------------
Post's attachments

MultiPlayerControl.zip 3.68 kb, 937 downloads since 2007-05-05 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).