Что нового

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

Danver

Новичок
Сообщения
26
Репутация
2
Собственно вопрос в теме.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

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 473
Репутация
2 403
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 должен быть запущен и открыта папка с треками.
 
Верх