<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AutoHotkey: Управление разными плеерами (Foobar, WinAmp и другие)]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=451&amp;type=atom" />
	<updated>2007-05-05T14:05:15Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=451</id>
		<entry>
			<title type="html"><![CDATA[AutoHotkey: Управление разными плеерами (Foobar, WinAmp и другие)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=2779#p2779" />
			<content type="html"><![CDATA[<p>Вот <a href="http://forum.script-coding.com/viewtopic.php?id=75">здесь</a> я выкладывал скрипт по управлению WinAmp&#039;ом. А вот <a href="http://forum.script-coding.com/viewtopic.php?id=450">тут</a> - скрипт по управлению Foobar&#039;ом.<br />Здесь я предлагаю совмещённый скрипт, позволяющий управлять этими плеерами. Работает скрипт так: если запущен какой-то один из этих плееров, то им и производится управление. Если запущены оба плеера, то управляем тем, который выбран как предпочитаемый. Предпочитаемый плеер задаётся в настройках и может быть изменён в процессе выполнения скрипта (из меню в трее). Кроме того, список управляемых плееров легко расширить (нужно только знать управляющие команды добавляемых плееров). <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Скрипт можно забрать архивчиком.</p><div class="codebox"><pre><code>;*******************************************************************************
; 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&#039;у, Menu_WinAmp
Menu, Tray, Add, Предпочтение FooBar&#039;у, Menu_FooBar
Menu, Tray, Add ; разделитель
Menu, Tray, Add, В&amp;ыход, Exit_Script ; выйти из скрипта
; расставляем галочки
If PreferPlayer = Winamp
    Menu, Tray, Check, Предпочтение WinAmp&#039;у ; поставить галочку в меню
If PreferPlayer = FooBar
    Menu, Tray, Check, Предпочтение FooBar&#039;у ; поставить галочку в меню
Return ; закончить автовыполняющуюся часть
; ========== КОНЕЦ СОЗДАНИЯ МЕНЮ В ТРЕЕ ========================================

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

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

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


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


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


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


; ========== СВЕРНУТЬ/РАЗВЕРНУТЬ ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadMult:: ; свернуть/развернуть
Numpad0 &amp; NumpadMult:: ; свернуть/развернуть
WinAmp_Min_Restore: ; метка входа из WIN+S
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = &quot;WinAmp&quot; ) ; если управлять нужно WinAmp&#039;ом
    {
        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() = &quot;FooBar&quot; ) ; если управлять нужно FooBar&#039;ом
    {
        WinGet, State, MinMax, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
        If State = -1 ; если окно минимизировано, то...
            FooBarControl( &quot;show&quot; ) ; восстановить свернутое окно
        Else ; если окно НЕ минимизировано, то...
        {
            IfWinActive, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
                FooBarControl( &quot;hide&quot; ) ; свернуть окно
            Else ; если окно НЕ активно, то...
                FooBarControl( &quot;show&quot; ) ; окно - на передний план
        }
    }
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ВОСПРОИЗВЕДЕНИЕ/ПАУЗА ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadClear:: ; воспроизведение/пауза
Numpad0 &amp; Numpad5:: ; воспроизведение/пауза
Media_Play_Pause:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    If ( WhatPlayer() = &quot;WinAmp&quot; ) ; если управлять нужно WinAmp&#039;ом
    {
        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() = &quot;FooBar&quot; ) ; если управлять нужно FooBar&#039;ом
        FooBarControl( &quot;playpause&quot; )
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


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


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


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


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


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


; ========== ДИАЛОГ ОТКРЫТИЯ ФАЙЛОВ ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadDiv:: ; диалог открытия файлов
Numpad0 &amp; NumpadDiv:: ; диалог открытия файлов
;-----------------------------------------------------------------------------
    If ( WhatPlayer() = &quot;WinAmp&quot; ) ; если управлять нужно WinAmp&#039;ом
    {
        WinActivate, ahk_class Winamp v1.x ; активизировать окно
        PostMessage, 0x111, 40029,,, ahk_class Winamp v1.x ; окно открытия
    }
    If ( WhatPlayer() = &quot;FooBar&quot; ) ; если управлять нужно FooBar&#039;ом
    {
        FooBarControl( &quot;show&quot; ) ; активизировать окно
        FooBarControl( &quot;command:Open...&quot; ) ; вызвать окно открытия файлов
;~         FooBarControl( &quot;command:Load PlayList...&quot; ) ; окно открытия плей-листов
    }
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 &quot;FooBar&quot; ; вернуть из функции этот плеер
    If WinAmp_PID ; если запущен только Winamp, то...
        Return &quot;WinAmp&quot; ; вернуть из функции этот плеер
    ; если никакой из плееров не запущен, то...
    Return ; выйти из функции
} ; конец функции
;-------------------------------------------------------------------------------


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

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

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

    RunWait, %FooExePath% /&quot;%fooCommand%&quot; ; отправить команду foobar&#039;у (и дождаться её выполнения)
    SetBatchLines, %BatchLines_Before% ; восстанавливаем скорость скрипта
    Return ; выйти из функции
} ; конец функции
;-------------------------------------------------------------------------------</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Androgen]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=4</uri>
			</author>
			<updated>2007-05-05T14:05:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=2779#p2779</id>
		</entry>
</feed>
