1

Тема: AHK: Плеер

Решил сделать универсальное окошко с текстами песен.
Сюда же нужны и возможности включить, выключить, поставить на паузу, промотать музыку..
Вобщем-то, полноценный плеер нужен.
К своему удивлению, библиотек для плееров на ahk не нашел.
Да, есть SoundPlay, но SoundPause нету, не думаю что это подойдет.
К тому же, душа жаждет ту заветную плеерскую полосочку

Есть у кого пример уже написанного плеера?

Пока что перебиваюсь фоновым AIMP-ом
Вот что получилось:

#NoEnv
#Include C:\Program Files\AutoHotkey\Gdip.ahk
#IfWinActive, Kroke2

Size:=30
Spac:=Size+5

If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}

Gui, Kroke2: +E0x80000 +LastFound +OwnDialogs -Caption ;-AlwaysOnTop +ToolWindow 
Gui, Kroke2:Show,,Kroke2
hwnd1 := WinExist()															
hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)						
hdc := CreateCompatibleDC()													
obm := SelectObject(hdc, hbm)												
G := Gdip_GraphicsFromHDC(hdc)												
;																			
Gdip_SetSmoothingMode(G, 0) 												

pBrushYellow	:=Gdip_BrushCreateSolid("0xffbbbb00")
pBrushBlack		:=Gdip_BrushCreateSolid("0xff000000")

EscapeNope:=0

Names:=[]
loop,%A_ScriptDir%\*.mp3
{
	Names.push(A_LoopFileName)
	nNames++
}

MainDY:=0

St:
Gdip_GraphicsClear(G, 0xff000000)

for k, v in Names
	Gdip_TextToGraphics(G, "|  " substr(v,1,-4),"x100 y" 50+(A_Index-1)*Spac-MainDY*spac " cffaaaaaa s" Size) ;cffbbbb00

SquarePos:=1

UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
OnMessage(0x200, "WM_MOUSEMOVE")
Return

WM_MOUSEMOVE()
{
	global
MouseGetPos, mx, my
if (mx<100 or mx>A_ScreenWidth-100 or my<50 or (my-50)//Spac+1+MAINDY>nNames)
	Return

pSquarePos:=SquarePos
SquarePos:=(my-50)//Spac+1+MAINDY

if (pSquarePos!=SquarePos)
	{
	Gdip_FillRectangle(G, pBrushBlack, 0, 53+(SquarePos-1-MAINDY)*Spac, A_ScreenWidth, size+4)
	Gdip_FillRectangle(G, pBrushBlack, 0, 53+(pSquarePos-1-MAINDY)*Spac, A_ScreenWidth, size+4)
	Gdip_TextToGraphics(G, "|  " substr(Names[SquarePos],1,-4) ,"x110 y" 50+(SquarePos-1-MAINDY)*Spac " cffbbbb00 s" Size) ;cffbbbb00
	Gdip_TextToGraphics(G, "|  " substr(Names[pSquarePos],1,-4) ,"x100 y" 50+(pSquarePos-1-MAINDY)*Spac " cffaaaaaa s" Size) ;cffbbbb00

	UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
	}
}

LButton::
if EscapeNope=0
	Run, % Names[SquarePos]
	; SoundPlay, % Names[SquarePos]
Return

Space::
if EscapeNope=1
	Run, % Names[SquarePos]
Return

RButton::
Gdip_GraphicsClear(G, 0xff000000)
FileRead, lyrics, % substr(Names[SquarePos],1,-4) ".txt"
yst:=0
maxyst:=-spac*15
loop,parse,lyrics,`n
	maxyst+=spac

Gdip_TextToGraphics(G, lyrics,"x100 y" 50+(A_Index-1)*Spac-yst " cffbbbb00 s" Size) ;cffbbbb00
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)

OnMessage(0x200, "WM_MOUSEMOVE",0)
Hotkey, LButton, MinusTime
Hotkey, RButton, PlusTime
EscapeNope:=1
Return

Lyrics:
Gdip_GraphicsClear(G, 0xff000000)
Gdip_TextToGraphics(G, lyrics,"x100 y" 50+(A_Index-1)*Spac-yst " cffbbbb00 s" Size) ;cffbbbb00
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
Return

MButton::Media_Play_Pause

Escape::
if EscapeNope=0
	ExitApp
else
{
	EscapeNope:=0
	Hotkey, LButton, LButton
	Hotkey, RButton, RButton
	goto st
}
Return

PlusTime:
Send,^!{Volume_Up}
Return

MinusTime:
Send,^!{Volume_Down}
Return

^WheelUp::
if (size<50)
{
Size++
Spac:=Size+5
}
if EscapeNope=0
	goto st
if EscapeNope=1
	goto Lyrics
Return

^WheelDown::
if (size>14)
{
Size--
Spac:=Size+5
}
if EscapeNope=0
	goto st
if EscapeNope=1
	goto Lyrics
Return


WheelDown::
if EscapeNope=1
{
if (yst<maxyst)
	yst+=spac*2
goto Lyrics
}
Else
{
	MainDY++
	goto st
}
Return


WheelUp::
if EscapeNope=1
{
if (yst>0)
	yst-=spac*2
goto Lyrics
}
Else if MainDY>0
{
	MainDY--
	goto st
}
Return

Для работы нужно закинуть в папку со скриптом mp3 и txt файлы с одинаковым именем. (MyMysic.mp3, MyMysic.txt)
А там, потыкаете и разберетесь.

2 (изменено: svoboden, 2018-06-03 19:28:51)

Re: AHK: Плеер

shahlik002 пишет:

Есть у кого пример уже написанного плеера?

Плеера существуют на autohotkey, а зачем они нужны, если есть плагин MiniLyrics.
https://ru.wikipedia.org/wiki/MiniLyrics.

3

Re: AHK: Плеер

svoboden
Ну раз уж они есть, поделись, пожалуйста.
Я вот не знаю как этот плагин можно подружить с AHK.
Я ведь пример просил...

4

Re: AHK: Плеер

https://autohotkey.com/joe_df/autohotke … I_v1.1.zip

5

Re: AHK: Плеер

Malcev
Спасибо огромное, буду разбираться.

6 (изменено: svoboden, 2018-06-03 19:29:49)

Re: AHK: Плеер

shahlik002 пишет:

Ну раз уж они есть, поделись, пожалуйста.

https://autohotkey.com/boards/viewtopic … lit=Lyrics.

shahlik002 пишет:

Я вот не знаю, как этот плагин можно подружить с AHK.

Так не с ahk нужно его дружить, а практически c любым нормальным плеером.
Крякнутых версий этого плагина в интернете полно.

7

Re: AHK: Плеер

svoboden
Спасибо, однако, но я лучше попрактикуюсь в скриптинге.

8

Re: AHK: Плеер

Не понял ответа. Ну так скачайте исходный код этого плеера или посмотрите его в exe файле. И практикуйтесь сколько хотите.

9

Re: AHK: Плеер

Не хочу качать, свой желаю делать
Вот что уже есть:

#NoEnv
#Include C:\Program Files\AutoHotkey\Gdip.ahk
#Include C:\Program Files\AutoHotkey\MCI.ahk
#IfWinActive, Kroke2
CoordMode, Mouse, Screen
StringCaseSense, off

Size:=30
Spac:=Size+5

If !pToken := Gdip_Startup()
{
	MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
	ExitApp
}

Gui, Kroke2: +E0x80000 +LastFound +OwnDialogs -Caption ;-AlwaysOnTop +ToolWindow 
Gui, Kroke2:Show,,Kroke2
hwnd1 := WinExist()															
hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)						
hdc := CreateCompatibleDC()													
obm := SelectObject(hdc, hbm)												
G := Gdip_GraphicsFromHDC(hdc)												
;																			
Gdip_SetSmoothingMode(G, 0) 												

pBrushYellow	:=Gdip_BrushCreateSolid("0xffbbbb00")
pBrushBlack		:=Gdip_BrushCreateSolid("0xff000000")

EscapeNope:=0

SquarePos:=1

patern:=-1

st2:

Names:=
Pathes:=
Highlight:=

Names:=[]
Pathes:=[]
Highlight:=[]
nNames:=0
MainDY:=0

if patern=-1
	loop %A_ScriptDir%\*.mp3			; loop,%A_ScriptDir%\*.mp3 
	{
		Names.push(A_LoopFileName)
		Pathes.push(A_LoopFileFullPath)
		Highlight.push(0)
		nNames++
	}
Else if patern=
	loop files,D:\Music\*.mp3, R			; loop,%A_ScriptDir%\*.mp3 
	{
		Names.push(A_LoopFileName)
		Pathes.push(A_LoopFileFullPath)
		Highlight.push(0)
		nNames++
	}
Else
	loop files,D:\Music\*.mp3, R
		if A_LoopFileName Contains %patern%
	{
		Names.push(A_LoopFileName)
		Pathes.push(A_LoopFileFullPath)
		Highlight.push(0)
		nNames++
	}


St:
if EscapeNope=1
	goto Lyrics

Gdip_GraphicsClear(G, 0xff000000)
Gdip_FillRectangle(G, pBrushYellow, 0, 0, MCI_Position(hMedia)/MediaLength*A_ScreenWidth, 3)

for k, v in Names
{
	if (A_Index<(-50)//Spac+1+MAINDY or A_Index>(A_ScreenHeight)//Spac+1+MAINDY)
		Continue

	Gdip_TextToGraphics(G, "|  " substr(v,1,-4),"x" 100+Highlight[A_Index]*5 " y" 50+(A_Index-1)*Spac-MainDY*spac " cffaaaaaa s" Size) ;cffbbbb00
}


OnMessage(0x200, "WM_MOUSEMOVE") ;0xA0 0x200
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
WM_MOUSEMOVE()
; goto slide
Return


;############################################################################################################################################



WM_MOUSEMOVE()
{
	global
MouseGetPos, mx, my

if (pSquarePos!=SquarePos)
	pSquarePos:=SquarePos
SquarePos:=(my-50)//Spac+1+MAINDY

if (pSquarePos!=SquarePos)
	{
		hl:=1
		SetTimer, hl, 5
		SetTimer, UnHighlight,30
	}
}


UnHighlight:
		indx:=0
			for k,v in Highlight
				if (v>0 and A_Index!=SquarePos)
			{
				indx++
				Highlight[A_Index]--
				Gdip_FillRectangle(G, pBrushBlack, 0, 53+(A_Index-1-MAINDY)*Spac, A_ScreenWidth, size+4)
				Gdip_TextToGraphics(G, "|  " substr(Names[A_Index],1,-4) ,"x" 100+Highlight[A_Index]*5 "y" 50+(A_Index-1-MAINDY)*Spac " cffaaaaaa s" Size)
			}
				UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
		if indx=0
SetTimer, UnHighlight,off
Return

hl:
	if (hl=10 or SquarePos<1 or SquarePos>nNames)
	{
		SetTimer, hl, off
		Return
	}

	hl++
	Gdip_FillRectangle(G, pBrushBlack, 0, 50+(SquarePos-1-MAINDY)*Spac, A_ScreenWidth, size+9)
	Gdip_TextToGraphics(G, "|  " substr(Names[SquarePos],1,-4) ,"x" 100+hl*3 " y" 50+(SquarePos-1-MAINDY)*Spac " cffbbbb00 s" Size) ;cffbbbb00
	UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
	Highlight[SquarePos]:=hl
Return

LButton::
MouseGetPos, x, y
if y<4
{
	MCI_Play(hMedia, "from " round(MediaLength*x/A_ScreenWidth),"NotifyEndOfPlay")
	Gdip_FillRectangle(G, pBrushBlack, 0, 0, A_ScreenWidth, 3)
	goto slide
}
Else if EscapeNope=0
{
MCI_Stop(hMedia)
hMedia:=MCI_Open(Pathes[SquarePos])
MediaLength:=MCI_Length(hMedia)
MCI_Play(hMedia, "from " 0,"NotifyEndOfPlay")
Gdip_FillRectangle(G, pBrushBlack, 0, 0, A_ScreenWidth, 3)
SetTimer, slide, 500
}
Return

slide:
Gdip_FillRectangle(G, pBrushYellow, 0, 0, MCI_Position(hMedia)/MediaLength*A_ScreenWidth, 3)
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
Return

Space::
if EscapeNope=0
	Return
MCI_Stop(hMedia)
hMedia:=MCI_Open(Pathes[SquarePos])
MediaLength:=MCI_Length(hMedia)
MCI_Play(hMedia, "from " 0,"NotifyEndOfPlay")
Gdip_FillRectangle(G, pBrushBlack, 0, 0, A_ScreenWidth, 3)
SetTimer, slide, 500
Return

RButton::
MouseGetPos, x, y
if (EscapeNope=1 and x=0 and y=0)
	goto escape
else if EscapeNope=1
	Return
SetTimer, hl, off
SetTimer, UnHighlight,off
FileRead, lyrics, % substr(Names[SquarePos],1,-4) ".txt"
yst:=0
maxyst:=-spac*15
loop,parse,lyrics,`n
	maxyst+=spac

OnMessage(0x200, "WM_MOUSEMOVE",0)
EscapeNope:=1
; Return

Lyrics:
Gdip_GraphicsClear(G, 0xff000000)
Gdip_FillRectangle(G, pBrushYellow, 0, 0, MCI_Position(hMedia)/MediaLength*A_ScreenWidth, 3)
Gdip_TextToGraphics(G, lyrics,"x100 y" 50+(A_Index-1)*Spac-yst " cffaaaaaa s" Size) ;cffbbbb00
UpdateLayeredWindow(hwnd1, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
Return


;#############################################		HotKeys		#############################################

MButton::
Status:=MCI_Status(hMedia)
if Status=Playing
{
	MCI_Pause(hMedia)
	SetTimer, slide, off
}
else if Status=Paused
{
	MCI_Resume(hMedia)
	SetTimer, slide, on
}
Return

Escape::
if EscapeNope=0
	ExitApp
else
{
	EscapeNope:=0
	goto st
}


^WheelUp::
if (size<50)
{
Size++
Spac:=Size+5
}
if EscapeNope=0
	goto st
else
	goto Lyrics

^WheelDown::
if (size>14)
{
Size--
Spac:=Size+5
}
gosub st

WheelDown::
if (EscapeNope=1 and yst<maxyst)
	yst+=spac*4
Else
	MainDY+=4
goto sub

WheelUp::
if (EscapeNope=1 and yst>0)
	yst-=spac*4
Else if MainDY>0
	MainDY-=4
goto sub

^f::
InputBox, patern, Find,,,200,100
goto st2


sub:
if Escapenope=1
	goto Lyrics
		SetTimer, hl, off
		SetTimer, UnHighlight,off
gosub st
		SetTimer, hl, 5
		SetTimer, UnHighlight,30
Return

Спасибо, Malcev-у за ссылку)

10 (изменено: svoboden, 2018-06-03 20:23:46)

Re: AHK: Плеер

shahlik002, а что значит вопрос: "Есть у кого пример уже написанного плеера?" И ответ - "Не хочу качать, свой желаю делать"?

11

Re: AHK: Плеер

Плеер по ссылке от svoboden базируется на библиотеке bass.
ИМХО имеет смысл использовать если не устраивает функционал MCI.

12 (изменено: svoboden, 2018-06-03 19:22:23)

Re: AHK: Плеер

Malcev пишет:

Плеер по ссылке базируется на библиотеки bass

Так да.

shahlik002, а в чем смысл слов: "Спасибо, однако, но я лучше попрактикуюсь в скриптинге"? Это к чему вообще относится?

13

Re: AHK: Плеер

svoboden
Я имел ввиду ahk.
На свой вопрос ответ уже нашел.
Хватит задавать мне новые вопросы

14 (изменено: terra-4, 2018-06-06 20:33:53)

Re: AHK: Плеер

shahlik002,  Пожалуйста если это возможно добавьте в плеер, возможность устанавливать точки "A" и "B", чтоб был цикл прослушивания между установленными точками "A" и "B".