<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AutoHotkey: Управление Foobar'ом]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=450&amp;type=atom" />
	<updated>2007-05-05T13:51:13Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=450</id>
		<entry>
			<title type="html"><![CDATA[AutoHotkey: Управление Foobar'ом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=2778#p2778" />
			<content type="html"><![CDATA[<p>Вот <a href="http://forum.script-coding.com/viewtopic.php?id=75">здесь</a> я выкладывал скрипт по управлению WinAmp&#039;ом. С тех пор я пересел на Foobar. Однако управлять им скриптами не так удобно, как WinAmp&#039;ом. В частности, он не понимает SendMessage/PostMessage, а управляется из командной строки. Такое управление имеет недостаток: нужно знать полный путь к Foobar&#039;у. А если вы изменили его расположение? Или запустили свой управляющий скрипт на чужой машине, где Foobar есть, но путь у него другой? Или вот у меня два Foobar&#039;а, один - тестовый, где я отлаживаю его вид, тестирую плагины и прочее (это особенность Foobar&#039;а: он очень гибко настраивается, но делать это непросто), а другой - уже настроенный, постоянный. И пути у них, разумеется, разные. Вот для того, чтобы можно было <strong>управлять Foobar&#039;ом независимо от того, откуда он запущен</strong> я и написал предлагаемую функцию:</p><div class="codebox"><pre><code>;-------------------------------------------------------------------------------
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><p>А вот скрипт, использующий эту функцию и содержащий самые главные, на мой взгляд, команды Foobar&#039;а (скрипт можно забрать архивом):</p><div class="codebox"><pre><code>;*******************************************************************************
; AutoHotkey Version:   1.0.44.09+
; Автор:                Androgen Belkin
; Имя скрипта:          FooBarControl().ahk (v.1.0)
;*******************************************************************************
; Управление Foobar&#039;ом.
;*******************************************************************************
;~ #NoTrayIcon            ; не отображать значок скрипта в трее
#SingleInstance force   ; перезагрузить скрипт, если он уже запущен
#NoEnv                ; запрещаем имена переменных как у переменных окружения
SendMode Input        ; новый режим высылки без задержки и повышенной надежности


; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
Foobar_Path = D:\Program_2\Foobar\foobar2000.exe
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========

; высылать эти клавиши всегда, кроме тех случаев, 
; когда они используется в горячих клавишах
$Numpad0:: Send, {Numpad0} ; высылать Numpad0
$NumpadIns:: Send, {NumpadIns} ; высылать NumpadIns

; ========== ЗАПУСТИТЬ Foobar ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadEnter:: ; запустить Foobar
Numpad0 &amp; NumpadEnter:: ; запустить Foobar
Launch_Media:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    IfNotExist, %Foobar_Path% ; если НЕ существует указанный файл для запуска
        Return ; закончить обработку горячей клавиши
    ; если путь указан верно, то продолжаем
    Process, Exist, Foobar.exe ; проверить существование процесса
    If ErrorLevel ; если Foobar уже запущен, то...
        WinActivate, ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}
    ; если не запущен, то...
    Run, %Foobar_Path% ; запустить
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ЗАКРЫТЬ FOOBAR ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadDel:: ; закрыть Foobar
Numpad0 &amp; NumpadDot:: ; закрыть Foobar
;-------------------------------------------------------------------------------
    FooBarControl( &quot;exit&quot; ) ; закрыть Foobar
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== СВЕРНУТЬ/РАЗВЕРНУТЬ ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadMult:: ; свернуть/развернуть
Numpad0 &amp; NumpadMult:: ; свернуть/развернуть
;-------------------------------------------------------------------------------
    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:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    FooBarControl( &quot;playpause&quot; )
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ПРЕДЫДУЩИЙ ТРЕК ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadLeft:: ; предыдущий трек
Numpad0 &amp; Numpad4:: ; предыдущий трек
Media_Prev:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    FooBarControl( &quot;prev&quot; ) ; предыдущий трек
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== СЛЕДУЮЩИЙ ТРЕК ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadRight:: ; следующий трек
Numpad0 &amp; Numpad6:: ; следующий трек
Media_Next:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    FooBarControl( &quot;next&quot; ) ; следующий трек
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== НАЗАД НА 5 СЕКУНД ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadHome:: ; назад на 5 секунд
Numpad0 &amp; Numpad7:: ; назад на 5 секунд
^Media_Prev:: ; обработка мультимедийной клавы (CTRL+)
;-------------------------------------------------------------------------------
    FooBarControl( &quot;command:Seek back by 5 seconds&quot; ) ; назад на 5 секунд
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ВПЕРЕД НА 5 СЕКУНД ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadPgUp:: ; вперед на 5 секунд
Numpad0 &amp; Numpad9:: ; вперед на 5 секунд
^Media_Next:: ; обработка мультимедийной клавы (CTRL+)
;-------------------------------------------------------------------------------
    FooBarControl( &quot;command:Seek ahead by 5 seconds&quot; ) ; вперед на 5 секунд
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ============== ОСТАНОВИТЬ ===============
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadEnd:: ; остановить
Numpad0 &amp; Numpad1:: ; остановить
Media_Stop:: ; обработка мультимедийной клавы
;-------------------------------------------------------------------------------
    FooBarControl( &quot;stop&quot; ) ; остановить воспроизведение
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------

; ========== ВОСПРОИЗВОДИТЬ ВРАЗБРОС =============
;-------------------------------------------------------------------------------
NumLock &amp; NumpadMult:: ; воспроизводить вразброс
;-------------------------------------------------------------------------------
    FooBarControl( &quot;command:Shuffle (tracks)&quot; ) ; воспроизводить вразброс
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ДИАЛОГ ОТКРЫТИЯ ФАЙЛОВ ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadDiv:: ; диалог открытия файлов
Numpad0 &amp; NumpadDiv:: ; диалог открытия файлов
;-------------------------------------------------------------------------------
    FooBarControl( &quot;show&quot; ) ; активизировать окно
    FooBarControl( &quot;command:Open...&quot; ) ; вызвать окно открытия файлов
;~  FooBarControl( &quot;command:Load PlayList...&quot; ) ; окно открытия плейлистов
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== ОКНО - ПОВЕРХ ВСЕХ ==========
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadUp:: ; окно Foobar - поверх всех
Numpad0 &amp; Numpad8:: ; окно Foobar - поверх всех
;-------------------------------------------------------------------------------
    FooBarControl( &quot;command:Always on Top&quot; ) ; окно - поверх всех
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== УМЕНЬШИТЬ ГРОМКОСТЬ =============
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadSub:: ; уменьшить громкость
Numpad0 &amp; NumpadSub:: ; уменьшить громкость
;-------------------------------------------------------------------------------
        FooBarControl( &quot;command:volume down&quot; )
Return ; закончить обработку горячей клавиши
;-------------------------------------------------------------------------------


; ========== УВЕЛИЧИТЬ ГРОМКОСТЬ =============
;-------------------------------------------------------------------------------
NumpadIns &amp; NumpadAdd:: ; увеличить громкость
Numpad0 &amp; NumpadAdd:: ; увеличить громкость
;-------------------------------------------------------------------------------
    FooBarControl( &quot;command:volume up&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><p>Путь к Foobar&#039;у в этом скрипте всё-таки указан, но он используется только для запуска плеера. Для всех остальных команд управления - он не нужен. Т.е. этот путь можно не указывать.</p><p><strong>А <a href="http://forum.script-coding.com/viewtopic.php?id=451">здесь</a> можно посмотреть и взять скрипт, совмещающий управление Foobar&#039;ом и WinAmp&#039;ом</strong></p>]]></content>
			<author>
				<name><![CDATA[Androgen]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=4</uri>
			</author>
			<updated>2007-05-05T13:51:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=2778#p2778</id>
		</entry>
</feed>
