Тема: 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 ; выйти из функции
} ; конец функции
;-------------------------------------------------------------------------------