Что нового

[Файловая система] Взаимодействие AutoIt'a с макросами/командами сторонних программ

rollex

Новичок
Сообщения
66
Репутация
1
Есть замечательный аудиоплеер - Apollo 37zz. Но удобство использования последнего оставляет желать лучшего. Я использую хоткеи, которые активируют окно, посылают Send() внутреннего хоткея, так как глобальные в Аполло не настраиваются. Знаю что есть расширение для плеера позволяющее настраивать глобальные клавиши, но сейчас не об этом..

В папке с программой есть файл, в котором написано: "...Вот набор макросов, которые можно использовать для взаимодействия с Apollo из других программ..." (Переведено с английского)

Открываем спойлер и видим содержимое этого файла..
C:
/*
  Updated 13.02.2003

  Here is a set of macros that can be used to interact with Apollo
  from other programs.

  Available macros:

    Apollo_GetFirstApolloWindowHandle()
    Apollo_GetNextApolloWindowHandle(hWnd)

    Apollo_GetVersion(hWnd)
    Apollo_GetStatus(hWnd)
        note: 0 = stopped, 1 = playing, 2 = paused

    Apollo_OpenFile(hWnd,filename)
    Apollo_OpenDirectory(hWnd,dirname)
    Apollo_OpenURL(hWnd,url)

    Apollo_AddFile(hWnd,filename)
    Apollo_AddDirectory(hWnd,dirname)
    Apollo_AddURL(hWnd,url)
    Apollo_AddRandomEntry(hWnd,conditionExpression)

    Apollo_ClearPlaylist(hWnd)

    Apollo_PreviousTrack(hWnd)
    Apollo_Stop(hWnd)
    Apollo_Play(hWnd)
    Apollo_Pause(hWnd)
    Apollo_NextTrack(hWnd)
    Apollo_FadeOut(hWnd)

    Apollo_PreviousTrackWithCrossfade(hWnd)
    Apollo_PlayWithCrossfade(hWnd)
    Apollo_NextTrackWithCrossfade(hWnd)

    Apollo_SetPlaylistPosition(hWnd,position)
        note: position is the index in playlist, not the track number
    Apollo_GetPlaylistPosition(hWnd)
    Apollo_GetCurrentTrackNumber(hWnd)

    Apollo_SetPlaybackPosition(hWnd,position)
    Apollo_GetPlaybackPosition(hWnd)
    Apollo_GetPlaybackPlaylistPosition(hWnd)
    Apollo_GetPlaybackCountdown(hWnd)
    Apollo_GetPlaybackPlaylistCountDown(hWnd)

    Apollo_SetVolume(hWnd,volume)
        note: volume is value between 0x0000 and 0xffff
    Apollo_GetVolume(hWnd)

    Apollo_CreateSampleSpace(hWnd)
        returns 0 if no tracks were found, otherwise 1
    Apollo_SetSampleSpaceSearchPath(hWnd,searchPath)

    Apollo_GetCurrentlyPlayedFilename(hWnd,buffer,bufferSize)
        copies full filename or URL to the buffer
    Apollo_GetCurrentlyPlayedTitle(hWnd,buffer,bufferSize)

    Apollo_GetPlaylistEntry(hWnd,index,buffer,bufferSize)
        copies full filename, URL or the condition expression
        beginning with semicolon to the buffer
    Apollo_GetPlaylistTitle(hWnd,index,buffer,bufferSize)
*/

// Window message definition

#define WM_APOLLO_COMMAND                       WM_USER + 3

// WM_APOLLO_COMMAND command definitions

#define APOLLO_GETVERSION                       0
#define APOLLO_GETSTATUS                        1

#define APOLLO_OPENFILE                         2
#define APOLLO_OPENDIRECTORY                    3
#define APOLLO_OPENURL                          4

#define APOLLO_ADDFILE                          5
#define APOLLO_ADDDIRECTORY                     6
#define APOLLO_ADDURL                           7
#define APOLLO_ADDRANDOMENTRY                   8

#define APOLLO_CLEARPLAYLIST                    9

#define APOLLO_PREVIOUSTRACK                    10
#define APOLLO_STOP                             11
#define APOLLO_PLAY                             12
#define APOLLO_PAUSE                            13
#define APOLLO_NEXTTRACK                        14
#define APOLLO_FADEOUT                          31

#define APOLLO_PREVIOUSTRACKWITHCROSSFADE       29
#define APOLLO_PLAYWITHCROSSFADE                30
#define APOLLO_NEXTTRACKWITHCROSSFADE           28

#define APOLLO_SETPLAYLISTPOSITION              15
#define APOLLO_GETPLAYLISTPOSITION              16
#define APOLLO_GETCURRENTTRACKNUMBER            17

#define APOLLO_SETPLAYBACKPOSITION              18
#define APOLLO_GETPLAYBACKPOSITION              19
#define APOLLO_GETPLAYBACKPLAYLISTPOSITION      32
#define APOLLO_GETPLAYBACKCOUNTDOWN             33
#define APOLLO_GETPLAYBACKPLAYLISTCOUNTDOWN     34

#define APOLLO_SETVOLUME                        20
#define APOLLO_GETVOLUME                        21

#define APOLLO_CREATESAMPLESPACE                22
#define APOLLO_SETSAMPLESPACESEARCHPATH         23

#define APOLLO_GETCURRENTLYPLAYEDFILENAME       24
#define APOLLO_GETCURRENTLYPLAYEDTITLE          25

#define APOLLO_GETPLAYLISTENTRY                 26
#define APOLLO_GETPLAYLISTTITLE                 27

// Macro definitions

#define Apollo_GetFirstApolloWindowHandle() \
    (HWND)FindWindow("Apollo - Main Window",NULL)

#define Apollo_GetNextApolloWindowHandle(hWnd) \
    (HWND)FindWindowEx(NULL,hWnd,"Apollo - Main Window",NULL)


#define Apollo_GetVersion(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETVERSION,0),(LPARAM)0)

#define Apollo_GetStatus(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETSTATUS,0),(LPARAM)0)


#define Apollo_OpenFile(hWnd,filename) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_OPENFILE; \
        cds.lpData = (void *)filename; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }

#define Apollo_OpenDirectory(hWnd,dirname) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_OPENDIRECTORY; \
        cds.lpData = (void *)dirname; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }

#define Apollo_OpenURL(hWnd,url) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_OPENURL; \
        cds.lpData = (void *)url; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }


#define Apollo_AddFile(hWnd,filename) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_ADDFILE; \
        cds.lpData = (void *)filename; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }

#define Apollo_AddDirectory(hWnd,dirname) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_ADDDIRECTORY; \
        cds.lpData = (void *)dirname; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }

#define Apollo_AddURL(hWnd,url) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_ADDURL; \
        cds.lpData = (void *)url; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }

#define Apollo_AddRandomEntry(hWnd,conditionExpression) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_ADDRANDOMENTRY; \
        cds.lpData = (void *)conditionExpression; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }


#define Apollo_ClearPlaylist(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_CLEARPLAYLIST,0),(LPARAM)0)


#define Apollo_PreviousTrack(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_PREVIOUSTRACK,0),(LPARAM)0)

#define Apollo_Stop(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_STOP,0),(LPARAM)0)

#define Apollo_Play(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_PLAY,0),(LPARAM)0)

#define Apollo_Pause(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_PAUSE,0),(LPARAM)0)

#define Apollo_NextTrack(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_NEXTTRACK,0),(LPARAM)0)

#define Apollo_FadeOut(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_FADEOUT,0),(LPARAM)0)


#define Apollo_PreviousTrackWithCrossfade(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_PREVIOUSTRACKWITHCROSSFADE,0),(LPARAM)0)

#define Apollo_PlayWithCrossfade(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_PLAYWITHCROSSFADE,0),(LPARAM)0)

#define Apollo_NextTrackWithCrossfade(hWnd) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_NEXTTRACKWITHCROSSFADE,0),(LPARAM)0)


#define Apollo_SetPlaylistPosition(hWnd,position) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_SETPLAYLISTPOSITION,0),(LPARAM)position)

#define Apollo_GetPlaylistPosition(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYLISTPOSITION,0),(LPARAM)0)

#define Apollo_GetCurrentTrackNumber(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETCURRENTTRACKNUMBER,0),(LPARAM)0)


#define Apollo_SetPlaybackPosition(hWnd,position) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_SETPLAYBACKPOSITION,0),(LPARAM)position)

#define Apollo_GetPlaybackPosition(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYBACKPOSITION,0),(LPARAM)0)

#define Apollo_GetPlaybackPlaylistPosition(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYBACKPLAYLISTPOSITION,0),(LPARAM)0)

#define Apollo_GetPlaybackCountdown(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYBACKCOUNTDOWN,0),(LPARAM)0)

#define Apollo_GetPlaybackPlaylistCountDown(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYBACKPLAYLISTCOUNTDOWN,0),(LPARAM)0)


#define Apollo_SetVolume(hWnd,volume) \
    SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_SETVOLUME,0),(LPARAM)volume)

#define Apollo_GetVolume(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETVOLUME,0),(LPARAM)0)


#define Apollo_CreateSampleSpace(hWnd) \
    (int)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_CREATESAMPLESPACE,0),(LPARAM)0)

#define Apollo_SetSampleSpaceSearchPath(hWnd,searchPath) \
    { \
        COPYDATASTRUCT cds; \
        cds.dwData = APOLLO_SETSAMPLESPACESEARCHPATH; \
        cds.lpData = (void *)searchPath; \
        cds.cbData = strlen((char *)cds.lpData) + 1; \
        SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds); \
    }


#define Apollo_GetCurrentlyPlayedFilename(hWnd,buffer,bufferSize) \
    { \
        HWND hTempWnd = (HWND)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETCURRENTLYPLAYEDFILENAME,0),(LPARAM)0); \
        SendMessage(hTempWnd,WM_GETTEXT,(WPARAM)bufferSize,(LPARAM)buffer); \
    }

#define Apollo_GetCurrentlyPlayedTitle(hWnd,buffer,bufferSize) \
    { \
        HWND hTempWnd = (HWND)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETCURRENTLYPLAYEDTITLE,0),(LPARAM)0); \
        SendMessage(hTempWnd,WM_GETTEXT,(WPARAM)bufferSize,(LPARAM)buffer); \
    }

#define Apollo_GetPlaylistEntry(hWnd,index,buffer,bufferSize) \
    { \
        HWND hTempWnd = (HWND)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYLISTENTRY,0),(LPARAM)index); \
        SendMessage(hTempWnd,WM_GETTEXT,(WPARAM)bufferSize,(LPARAM)buffer); \
    }

#define Apollo_GetPlaylistTitle(hWnd,index,buffer,bufferSize) \
    { \
        HWND hTempWnd = (HWND)SendMessage(hWnd,WM_APOLLO_COMMAND,(WPARAM)MAKELONG(APOLLO_GETPLAYLISTTITLE,0),(LPARAM)index); \
        SendMessage(hTempWnd,WM_GETTEXT,(WPARAM)bufferSize,(LPARAM)buffer); \
    }

Можно ли с их помощью взаимодействовать между плеером и автоитом? :blink:
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Думаю разберешься:
Код:
#include <SendMessage.au3>

Global $WM_USER = 0x400, $WM_APOLLO_COMMAND = $WM_USER + 3

If Not ProcessExists('apollo.exe') Then
	MsgBox(0, 'Ошибка', 'Apollo не запущен!')
	Exit
EndIf
$iPid = ProcessExists('apollo.exe')
$aWinList = WinList()

For $i = 1 To UBound($aWinList) - 1
	If WinGetProcess($aWinList[$i][1]) = $iPid And WinGetText($aWinList[$i][1]) <> '' Then
		$hWnd = $aWinList[$i][1]
		ExitLoop
	EndIf
Next

$APOLLO_PREVIOUSTRACK = 10
$APOLLO_STOP = 11
$APOLLO_PLAY = 12
$APOLLO_PAUSE = 13
$APOLLO_NEXTTRACK = 14

_SendMessage($hWnd, $WM_APOLLO_COMMAND, $APOLLO_PLAY)
Sleep(1500)
_SendMessage($hWnd, $WM_APOLLO_COMMAND, $APOLLO_NEXTTRACK)
Sleep(1500)
_SendMessage($hWnd, $WM_APOLLO_COMMAND, $APOLLO_PREVIOUSTRACK)
Sleep(1500)
_SendMessage($hWnd, $WM_APOLLO_COMMAND, $APOLLO_PAUSE)
 
Автор
R

rollex

Новичок
Сообщения
66
Репутация
1
Redline
Спасибо, работает. :IL_AutoIt_1:

А что делает эта строка?
Код:
Global $WM_USER = 0x400, $WM_APOLLO_COMMAND = $WM_USER + 3
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Код:
Global $WM_USER = 0x400, $WM_APOLLO_COMMAND = $WM_USER + 3

Это объявление глобальных переменных.
Переменная $WM_APOLLO_COMMAND = $WM_USER + 3 - так написано в твоем файле, а $WM_USER - это константа, которая определена в Windows и равна этому числу
Код:
// Window message definition

#define WM_APOLLO_COMMAND                       WM_USER + 3
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
rollex
для кода используй тэг [code][/code] а не цитату [quote][/quote]
 
Автор
R

rollex

Новичок
Сообщения
66
Репутация
1
Redline [?]
$WM_USER - это константа, которая определена в Windows и равна этому числу
Это и хотел узнать. Спасибо.

Kaster
Приму к сведению. 8)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Redline,
Я бы переименовал переменную $WM_USER в $WM_USER_APOLLO, так как она уже объявлена в WindowsConstants.au3 и может конфликт произойти.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
madmasles [?]
Я бы переименовал переменную $WM_USER в $WM_USER_APOLLO, так как она уже объявлена в WindowsConstants.au3 и может конфликт произойти.
Я вынес $WM_USER как раз из WindowsConstants, чтобы не инклудить этот файл целиком ;), но думаю вы правы.

Автору топика: если понадобится сделать
Код:
#include <WindowsConstants.au3>
, то придется убрать $WM_USER из скрипта или переименовать, т.к. это глобальная константа и дважды ее объявлять нельзя.
 
Автор
R

rollex

Новичок
Сообщения
66
Репутация
1
madmasles
Redline
Благодарю за советы. Пишу полноценный плагин для плеера, а благодаря "скрытым талантам" его возможности возрастут и свободного времени у меня будет все меньше и меньше... :laugh:
 
Верх