Что нового

[Автоматизация] Как послать команду "Play" проигрывателю 1by1?

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
Danver сказал(а):
Собственно вопрос в теме.
может скажешь какой проигрыватель хотя бы) или это военная тайна?

Конечно же Юпитер сегодня благосклонен к Вам, Звезды говорят, что кнопка должна нажаться ;)
 
Автор
D

Danver

Новичок
Сообщения
26
Репутация
2
К примеру для WinAmp'a есть специальная UDF... Там в принципе понятно. Но я бы хотел автоматизировать некоторые функции в плеере 1by1...

есть ли какая программа, или каким образом можно перехватить команду, которая выполняется в плеере при нажатии например кнопки "Play"?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Danver
мда... какой проигрыватель? то что если для Winamp не озночает, что будет для всего.
 
Автор
D

Danver

Новичок
Сообщения
26
Репутация
2
я и не пытался прикрутить UDF от Winamp к плееру 1by1...

я лишь хочу узнать как можно послать команду 1by1 средствами Autoit или скорее Autoit+WinAPI... а также походу как узнать какие команды понимает 1by1...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Danver
теперь понял, 1by1 - это и есть название плеера ;D просто ни разу с ним не сталкивался и не сразу сообразил. тем не менее, вики говорит что, у плеера есть поддержка ком. строки. покопайся в ней, если там есть ключи для управления плеером, то Run - твое все.
 
Автор
D

Danver

Новичок
Сообщения
26
Репутация
2
Danver [?]
Цитата
Как послать команду "Play" проигрывателю?
Код: AutoIt [Выделить]
ControlClick('[CLASS:1by1WndClass]', '', 'ToolbarWindow321', "Main", 1, 12, 10)

это думаю подойдет:smile: срабатывает даже когда плеер свернут в трей! СПАСИБО всем за советы!!!
 
Автор
D

Danver

Новичок
Сообщения
26
Репутация
2
вот... набросал на скорую руку простенькую UDFку для 1by1
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,664
Репутация
2,462
Danver [?]
набросал на скорую руку простенькую UDFку для 1by1
Я бы добавил опциональный параметр hWnd для каждой функций, где значением по умолчанию был бы класс окна.
Также можно в начале функции проверять запущен ли плеер, и если нет, то запускать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Re: [Автоматизация] Как послать команду \"Play\" проигрывателю 1by1?

Danver
можно еще Send'ить горячие клавиши :smile:


Добавлено:
Сообщение автоматически объединено:

а вообще, интересный плеер, жаль что только под винду
 
Автор
D

Danver

Новичок
Сообщения
26
Репутация
2
вообщем не могу нарадоваться:smile: хочу вот с вами поделиться тем, что получилось... может чего дельного посоветуете;)
скомпилированную прогу кинуть в папку с плеером и запустить...

Вот что сделал:
  • треки из списка доступны в меню в трее:smile:
  • можно из меню запускать нужный трек
  • трек который играем помечен в меню галочкой
  • действуют глобальные горячие клавиши: Win+Alt+F1 (Показать/скрыть окно плеера), Win+Alt+F2 (Предыдущий трек), Win+Alt+F3 (Пауза/Плей), Win+Alt+F4 (Следующий трек), планируется еще Директория вверх и вниз
  • при смене директории меню обновляется треками из нее
  • в подсказке к иконке отображается название трека
  • при смене трека вылазит всплывающая подсказка с его именем (если у вас не отключены всплывающие окна)

Пока все...

Проблемы:
  • если при первом запуске в плеере выбрана директория БЕЗ треков, то скрипт вылетает, хоть я и добавил туда проверку на пустой список:(
  • не эффективно пересоздается меню

Вопросы:
  • можно ли поставить событие на клик средней кнопкой по иконке?
  • может есть более лучшая замена Всплывающим подсказкам для уведомления о новом треке? OSD наверное врядли подойдет?
  • можно ли добавить в проект несколько последовательных иконок, которыми показывать прогресс трека вместо стандартной иконки?
  • может лучше вообще скрыть иконку плеера? а окно делать видимым или невидимым?

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Comment=Tune1by1
#AutoIt3Wrapper_Res_Description=Tune1by1
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Danver
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Include <HotKey.au3>
#Include <vkConstants.au3>
#Include <1by1.au3>
Global $OptionsArray[1]
Global $DefaultNumber = 1
Global $ExitItem
Global $Seperator
Global $CurSong
Global $CurPath

Opt("TrayMenuMode", 1)

If Not ProcessExists("1by1.exe") Then ; если плеер не запушен
	$Su = Run(@ScriptDir & "\1by1.exe") ; пробуем его запустить
	Sleep(1000)
	_1by1Hide()
	If $Su = 0 Then Exit ; если не получилось то выходим
EndIf

_HotKeyAssign(BitOR($CK_WIN, $CK_ALT, $VK_F3), '_1by1PauseResume') ; Вин+Альт+Ф3 - Плей/пауза
_HotKeyAssign(BitOR($CK_WIN, $CK_ALT, $VK_F2), '_1by1PrevTrack') ; Вин+Альт+Ф2 - Прде. Трек
_HotKeyAssign(BitOR($CK_WIN, $CK_ALT, $VK_F4), '_1by1NextTrack') ; Вин+Альт+Ф4 - След. трек
_HotKeyAssign(BitOR($CK_WIN, $CK_ALT, $VK_F1), 'ShowHide') ; Вин+Альт+Ф1 - Показать/скрыть

Func ShowHide() ; показать скрыть окно плеера
	If WinGetState ('[CLASS:1by1WndClass]') = 21 Then ; если скрыто
		_1by1Show() ; показать
	ElseIf WinGetState ('[CLASS:1by1WndClass]') = 15 Then ;  если активно
		_1by1Hide() ; скрыть
	EndIf
EndFunc

$CurPath = ControlTreeView('[CLASS:1by1WndClass]', "", "SysTreeView321", "GetSelected") ; запомним текущий путь

MakeMenu() ; сделаем меню

Func MakeMenu() ; сделаем меню
	If ControlListView('[CLASS:1by1WndClass]', "", "SysListView321", "GetItemCount") > 0 Then ; если список не пустой
		ReDim $OptionsArray[ControlListView('[CLASS:1by1WndClass]', "", "SysListView321", "GetItemCount")] ; подстраиваем массив под количество треков
		For $i = 0 To UBound($OptionsArray)-1 ; шагаем по массиву
			$OptionsArray[$i] = TrayCreateItem(ControlListView('[CLASS:1by1WndClass]', "", "SysListView321", "GetText", $i)) ; заполняем меню названиями песен
		Next
		$Seperator = TrayCreateItem("") ; добавляем разделитель
		$ExitItem = TrayCreateItem("Выход") ; добавляем меню выход
	EndIf
EndFunc

Func DelMenu() ; очищаем меню (не придумал как это сделать иначе)
		For $i = 0 To UBound($OptionsArray)-1 ; шакаем по массиву
			TrayItemDelete($OptionsArray[$i]) ; удаляем элемент
		Next
		TrayItemDelete($Seperator) ; удаляем разделитель
		TrayItemDelete($ExitItem) ; удаляем меню Выход
EndFunc

While 1
    Sleep(10)
	If $CurPath <> ControlTreeView('[CLASS:1by1WndClass]', "", "SysTreeView321", "GetSelected") Then ; если изменился путь в дереве (перешли в другую папку)
		DelMenu() ; очищаем меню
		sleep(1000)
		MakeMenu() ; заполняем треками из новой папки
		$CurPath = ControlTreeView('[CLASS:1by1WndClass]', "", "SysTreeView321", "GetSelected") ; запоминаем текущий путь
	EndIf
	$TrayMsg = TrayGetMsg() ; обрабатываем события меню
	For $i=0 to UBound($OptionsArray)-1 ; шагаем по массиву
		If $OptionsArray[$i] = $TrayMsg Then ; если произошедшее событие соответвует идентификатору меню
			ControlListView('[CLASS:1by1WndClass]', "", "SysListView321", "SelectClear") ; очищаем выделение в списке плеера
			ControlListView('[CLASS:1by1WndClass]', "", "SysListView321", "Select", $i) ; выделяем выбранный в меню трек в списке плеера
			TrayItemSetState($i,1) ; помечаем его галочкой
			_1by1Play() ; нажимаем плей
			TrayItemSetState($OptionsArray[$i],1) ; в подсказке к иконке в трее пишем трек, который выбрали и который сейчас играем
		EndIf
		If TrayItemGetText ($OptionsArray[$i]) = _1by1SongName() Then ; если играющий трек соответствует тому треку что в меню
			TrayItemSetState($OptionsArray[$i],1) ; помечаем его
		Else ; если не соответсвует
			TrayItemSetState($OptionsArray[$i],4) ; убираем пометку галочкой
		EndIf
	Next
	If $CurSong <> _1by1SongName() Then ; если текущая песня изменилась
		TrayTip("Играет трек:", _1by1SongName(), 10, 1) ; показываем всплывающую подсказку возле иконки в трее
		$CurSong = _1by1SongName() ; запоминаем название текущего трека
	EndIf
	If $TrayMsg = $ExitItem Then
		ProcessClose("1by1.exe") ; закрываем плеер
		Exit ; если нажали Выход то завершаем скрипт
	EndIf
	TraySetToolTip (_1by1SongName()) ; обновляем название песни в подсказке к иконке в трее
WEnd
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Если интересно, вот ещё вариант:
Код:
#Include <Memory.au3>
#Include <ProcessConstants.au3>
#Include <WinAPIEx.au3>
#include <ToolbarConstants.au3>

$hWnd = WinGetHandle("[CLASS:1by1WndClass]")
$iProcID = WinGetProcess("[CLASS:1by1WndClass]")
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:ToolbarWindow32; INSTANCE:1]")
#cs

0 - Play track from beginning
1 - Stop / Resume (Unpause)
2 - Play previous track
3- 	Play next track
5 - Search a directory/list backwards
6 - Search a directory/list forward
8 - Repeat off
10 - Settings
11 - Toggle compact view
12 - Toggle tree view
14 - Next: Move track to be played after current
15 - Skip: remove track from current list (not delete the file)
17 - (Re-)Shuffle 
19 - Toggle playlist view
21 - Reload file list
22 - Go to current track
23 - Mute
25 - Main menu IMHO не нужна

#ce

_TBClickButton($hToolBar, 0)

Func _TBClickButton($hToolBar, $iButtonID)
    Local $hTBBUTTON, $iProcessID, $hProcess, $hButton
	Local Const $t_TBBUTTON = "int Bitmap;" & _
							  "int Command;" & _
							  "byte State;" & _
							  "byte Style;" & _
							  "byte;" & _
							  "dword_ptr Param;" & _
							  "int_ptr String"
							  
	$hTBBUTTON = DllStructCreate($t_TBBUTTON)
	_WinAPI_GetWindowThreadProcessId($hToolBar, $iProcessID)
	$hProcess = _WinAPI_OpenProcess(BitOR($PROCESS_ALL_ACCESS, $PROCESS_DUP_HANDLE), True, $iProcessID)
	$hButton = _MemVirtualAllocEx($hProcess, 0, DllStructGetSize($hTBBUTTON), BitOR($MEM_COMMIT, $MEM_TOP_DOWN), $PAGE_READWRITE)
	_SendMessage($hToolBar, $TB_GETBUTTON,$iButtonID, $hButton)
	_WinAPI_ReadProcessMemory($hProcess, $hButton, DllStructGetPtr($hTBBUTTON), DllStructGetSize($hTBBUTTON), 0)
	_SendMessage($hToolBar, $WM_COMMAND , DllStructGetData($hTBBUTTON, "Command") , $hToolBar)
	_MemVirtualFreeEx($hProcess, $hButton, DllStructGetSize($hTBBUTTON), $MEM_RELEASE)
	_WinAPI_CloseHandle($hProcess)
EndFunc

Тот же вариант, но короче :smile:
Код:
#Include <WinAPIEx.au3>
#include <GuiToolbar.au3>
#include <ToolbarConstants.au3>

$hWnd = WinGetHandle("[CLASS:1by1WndClass]")
$hToolBar = ControlGetHandle($hWnd, "", "[CLASS:ToolbarWindow32; INSTANCE:1]")
$iCommand = _GUICtrlToolbar_IndexToCommand($hToolBar, 0)
_SendMessage($hToolBar, $WM_COMMAND, $iCommand, $hToolBar)


P.S. 1BY1 должен быть запущен и открыта папка с треками.
 
Верх