Seite 1 von 2

Small Mediacenter

Verfasst: 25.12.2013 13:16
von Velindos
Hallo Leute,
ein frohes Fest, wollte mir schnell mal eine Small Mediacenter programmieren!
Nun wie im Codec seht läuft es ja!
Wenn ich jedoch den Windows Media Player über meine Fernbedienung + ESC-Taste beenden möchte, habe ich keine Ahnung wie ich das sende!

PS: Habe Code noch lesbarer gemacht!

Code: Alles auswählen

; Purebasic Small MediaCenter Bedienung
; Taste1(Movie), Taste(TV), Taste3(Clips), Taste 4(OFF)
; WIndows Media Player mit Vollbildmodus ... ALT+EINGABETASTE, Beenden	ALT+F4
; Bedienung über Fernbedienung Harmony 300
; Es fehlt noch ENTER nach Focus von Button
EnableExplicit
ExamineDesktops()
;-Constanten
Enumeration
  #PresentParentWindow
  #PresentChildWindow_0
  #MovieCenter_01
  #MovieCenter_02
  #MovieCenter_03
  #MovieCenter_04
  #Movie
  #TastenDruckPfeilTasteLinks
  #TastenDruckPfeilTasteRechts
  #TastenDruckESC
  
EndEnumeration
Global MovieDateiname$= "F:\Videos\MyMovies\Test.flv"

OpenWindow(#PresentParentWindow,0,0,DesktopWidth(#PresentParentWindow),DesktopHeight(#PresentParentWindow),"Snipping Test",#PB_Window_BorderLess  );#PB_Window_Invisible
ButtonGadget(#MovieCenter_01, 130,300,200,200, "MOVIE")
ButtonGadget(#MovieCenter_02, 430,300,200,200, "TV")
ButtonGadget(#MovieCenter_03, 730,300,200,200,"CLIP")
ButtonGadget(#MovieCenter_04, 1030,300,200,200,"OFF")
AddKeyboardShortcut(#PresentParentWindow, #PB_Shortcut_Left, #TastenDruckPfeilTasteLinks) ; Pfeil Links einschalten
AddKeyboardShortcut(#PresentParentWindow, #PB_Shortcut_Right, #TastenDruckPfeilTasteRechts) ; Pfeil Rechts einschalten
AddKeyboardShortcut(#PresentParentWindow, #PB_Shortcut_Escape, #TastenDruckESC) ; Escape einschalten

Global MediaButtonFocus =1
SetGadgetText(#MovieCenter_01, "  >> MOVIE <<")
SetActiveGadget(#MovieCenter_01)

;-REPEAT
Define EventID, lEvent, hWnd, Key.l 
Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_CloseWindow 
      End; Sollte "Herunterfahren des PC´s" sein, keine Ahnung wie!!
      
      ;- GADGET
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #MovieCenter_01 ; Movie ansehen, Pfad wird vorgegeben
          MediaButtonFocus = 1 ; Für Buttonsteuerung per Fernsteuerung
          MovieDateiname$             = OpenFileRequester("bla", "bla", "", 0)
          ; Sende an Windows MediaPlayer ALT+EINGABETASTE
          RunProgram("C:\Program Files (x86)\Windows Media Player\wmplayer.exe",Chr(34)+ MovieDateiname$ +Chr(34),"", #PB_Program_Wait|#PB_Program_Open );
          ; Jetzt mit 	ALT+F4 Beenden, Problem das Fenster hat nicht den Focus
          
        Case #MovieCenter_02 ; TV 
          MediaButtonFocus = 2 ; Für Buttonsteuerung per Fernsteuerung
          RunProgram("explorer.exe ",Chr(34)+"C:\Program Files (x86)\DVBViewer\dvbviewer.exe"+Chr(34),"");#PB_Program_Wait
          
        Case #MovieCenter_03 ; CLIP sollte über PB Player laufen, funzt aber nicht!!!!!!!!!!!!!!!!
          MediaButtonFocus = 3 ; Für Buttonsteuerung per Fernsteuerung
          MovieDateiname$             = OpenFileRequester("bla", "bla", "", 0)
          ;           LoadMovie(#Movie, MovieDateiname$) ; Funzt nicht
          ;           PlayMovie(#Movie, WindowID) ; Funzt nicht
          ; ID = ScreenID(); Funzt nicht
          
        Case #MovieCenter_04 ; OFF
          MediaButtonFocus = 4 ; Für Buttonsteuerung per Fernsteuerung
          End  
      EndSelect
      
    Case #PB_Event_Menu ; <<< Ereigniss am Menu
      Select EventMenu()
          
        Case #TastenDruckPfeilTasteLinks ; < Tastatur
          Debug "PfeilTasteLinks"
          If MediaButtonFocus = 1
            SetGadgetText(#MovieCenter_01, "MOVIE")
            SetGadgetText(#MovieCenter_04, " >> OFF <<")
            SetActiveGadget(#MovieCenter_04)
            MediaButtonFocus = 4
          ElseIf MediaButtonFocus = 4
            SetGadgetText(#MovieCenter_04, "OFF")
            SetGadgetText(#MovieCenter_03, " >> CLIP <<")
            SetActiveGadget(#MovieCenter_03)
            MediaButtonFocus = 3
          ElseIf MediaButtonFocus = 3
            SetGadgetText(#MovieCenter_03, "CLIP")
            SetGadgetText(#MovieCenter_02, " >> TV <<")
            SetActiveGadget(#MovieCenter_02)
            MediaButtonFocus = 2
          ElseIf MediaButtonFocus = 2
            SetGadgetText(#MovieCenter_02, "TV")
            SetGadgetText(#MovieCenter_01, "  >> MOVIE <<")
            SetActiveGadget(#MovieCenter_01)
            MediaButtonFocus = 1
          EndIf
        Case #TastenDruckPfeilTasteRechts ; > Tastatur
          Debug "PfeilTasteRechts"
          If MediaButtonFocus = 1
            SetGadgetText(#MovieCenter_01, "MOVIE")
            SetGadgetText(#MovieCenter_02, " >> TV <<")
            SetActiveGadget(#MovieCenter_02)
            MediaButtonFocus = 2
          ElseIf MediaButtonFocus = 2
            SetGadgetText(#MovieCenter_02, "TV")
            SetGadgetText(#MovieCenter_03,"  >> CLIP <<")
            SetActiveGadget(#MovieCenter_03)
            MediaButtonFocus = 3
          ElseIf MediaButtonFocus = 3
            SetGadgetText(#MovieCenter_03, "CLIP")
            SetGadgetText(#MovieCenter_04, " >> OFF <<")
            SetActiveGadget(#MovieCenter_04)
            MediaButtonFocus = 4
          ElseIf MediaButtonFocus = 4
            SetGadgetText(#MovieCenter_04, "OFF")
            SetGadgetText(#MovieCenter_01, "  >> MOVIE <<")
            SetActiveGadget(#MovieCenter_01)
            MediaButtonFocus = 1
          EndIf
        Case #TastenDruckESC
          Debug "ESC"
      EndSelect
    Case #WM_KEYUP ; Fernbedienung
      ;         ; Debug "#KEYUP:   " + Str(EventwParam())
      Key.l = EventwParam()
      Select KEY
        Case 13
          If MediaButtonFocus = 1
            Debug "Movie ENTER"
          ElseIf MediaButtonFocus = 2
            Debug "TV ENTER"
          ElseIf MediaButtonFocus = 3
            Debug "Clip ENTER"
          ElseIf MediaButtonFocus = 4
            Debug "Off ENTER"
          EndIf
        Case 27   ; ESC => Velindos ENDE
          Debug "ESC"
          ;           End
          ;Das Problem, das Windows hat den Focus
          ; ???? 
          ;Send_Key ALT_F4 < =================================
      EndSelect
  EndSelect
ForEver 
Gruss ... Velindos

Re: Small Mediacenter

Verfasst: 25.12.2013 16:14
von uweb
Um ehrlich zu sein : Ich weiß es nicht.
Aber ich vermute, dass der Windows Media Player nicht auf normale Fenster-Nachrichten reagiert - zumindest habe ich es auf die Schnelle so auch nicht hin bekommen.
Deswegen habe ich es über den Process probiert. Das ist zwar wahrscheinlich noch nicht die endgültige Lösung, zeigt aber vielleicht eine alternative Richtung:

Code: Alles auswählen

Procedure GetProcessId_(hProcess)
  Static *pGetProcessId
  Protected *func = AllocateMemory(13)
  
  PokeS(*func, "GetProcessId", -1, #PB_Ascii)
  
  If Not *pGetProcessId
    *pGetProcessId=GetProcAddress_(GetModuleHandle_("kernel32.dll"),*func)
  EndIf
 
  If Not *pGetProcessId
    ProcedureReturn 0
  EndIf
  
  FreeMemory(*func)
  
  ProcedureReturn CallFunctionFast(*pGetProcessId,hProcess)
EndProcedure

Procedure RunProgram_(ProgramName.s, Parameter.s="", WorkingDirectory.s="", Visible=#SW_SHOW)
  Protected ShellExInfo.SHELLEXECUTEINFO
 
  ShellExInfo\cbSize=SizeOf(ShellExInfo)
  ShellExInfo\fMask=#SEE_MASK_NOCLOSEPROCESS
  ShellExInfo\lpVerb=@"Open"
  ShellExInfo\lpFile=@ProgramName.s
  ShellExInfo\lpParameters=@Parameter.s
  ShellExInfo\lpDirectory=@WorkingDirectory.s
  ShellExInfo\nShow=Visible
 
  ShellExecuteEx_(@ShellExInfo)
 
  ProcedureReturn GetProcessId_(ShellExInfo\hProcess)
EndProcedure

Procedure KillProcess(pid)
  Protected phandle
  Protected result
  
  phandle = OpenProcess_(#PROCESS_TERMINATE, #False, pid)
  If phandle <> #Null
    If TerminateProcess_(phandle, 1)
      result = #True
    EndIf
    CloseHandle_(phandle)
  EndIf
  ProcedureReturn result
EndProcedure 

....

MediaProgramm = RunProgram_("C:\Program Files (x86)\Windows Media Player\wmplayer.exe",Chr(34)+ MovieDateiname$ +Chr(34),"", #PB_Program_Wait|#PB_Program_Open );

....
If MediaProgramm : KillProcess(MediaProgramm) : EndIf

Re: Small Mediacenter

Verfasst: 25.12.2013 16:14
von HeX0R
Naja, so toll ist es aber auch nicht, dass dein "Mediacenter" einfriert, während man einen Film schaut.
Ich habe das mal ein wenig umgebastelt, allerdings habe ich nur mal auf den Button "Movie" geachtet, bei den anderen waren mir einfach zu viele Pfade fest vorgegeben.

Ich schätze, um an das Windows-Handle zu kommen gibt es elegantere Methoden, meine Win-API-Fähigkeiten sind leider etwas eingerostet.
Bei mir zumindest geht es so:

Code: Alles auswählen

ExamineDesktops()

Enumeration
	#PresentParentWindow
	#PresentChildWindow_0
	#MovieCenter_01
	#MovieCenter_02
	#MovieCenter_03
	#MovieCenter_04
	#Movie
EndEnumeration

Procedure GetMediaPlayerHwnd(PID)
	Protected hWnd, pszClassName.s, dwWindowID
	
	hWnd         = GetTopWindow_(#Null)
	pszClassName = Space(200)
	
	While hWnd <> #Null
		If GetClassName_(hWnd, @pszClassName, 200) > 0
			If pszClassName = "WMPlayerApp"
    		If GetWindowThreadProcessId_(hWnd, @dwWindowId)
    			If dwWindowId = PID
    				ProcedureReturn hwnd
					EndIf
				EndIf
			EndIf
	  EndIf
	  hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
	Wend

EndProcedure


Global MovieDateiname$ = "F:\Videos\MyMovies\muster.flv"
OpenWindow(#PresentParentWindow, 0, 0, DesktopWidth(0), DesktopHeight(0), "Snipping Test");, #PB_Window_BorderLess  );#PB_Window_Invisible
AddKeyboardShortcut(#PresentParentWindow, #PB_Shortcut_Escape, 0)
; ===================================================================
;-[0] Media
; ===================================================================
; ContainerGadget(#PresentChildWindow_0,0,0,DesktopWidth(0),DesktopHeight(0))
; SetGadgetColor(#PresentChildWindow_0, #PB_Gadget_BackColor,$000000)
ButtonGadget(#MovieCenter_01, 130, 300, 200, 200, "Movie")
ButtonGadget(#MovieCenter_02, 430, 300, 200, 200, "TV")
ButtonGadget(#MovieCenter_03, 730, 300, 200, 200, "CLIP")
ButtonGadget(#MovieCenter_04, 1030, 300, 200, 200, "OFF")
; CloseGadgetList()
; HideWindow(#PresentParentWindow, #False)
; HideWindow(#PresentChildWindow_0,#True)
; Fabverlauf
;-REPEAT
Define EventID, lEvent, hWnd, File.s
Repeat
	EventID = WaitWindowEvent(20)
	Select EventID
		Case 0

			If MediaProgramm And ProgramRunning(MediaProgramm) = 0
				DisableGadget(#MovieCenter_01, 0)
				DisableGadget(#MovieCenter_02, 0)
				DisableGadget(#MovieCenter_03, 0)
				MediaProgramm = 0
			EndIf
		Case #PB_Event_CloseWindow
			If MediaProgramm
				hWnd = GetMediaPlayerHwnd(ProgramID(MediaProgramm))
				SendMessage_(hWnd, #WM_CLOSE, #Null, #Null)
			EndIf
			Break
			;- GADGET
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #MovieCenter_01 ; Movie
					MediaButtonFocus = 1
					File             = OpenFileRequester("bla", "bla", "", 0)
					MediaProgramm    = RunProgram("C:\Program Files (x86)\Windows Media Player\wmplayer.exe", Chr(34) + File + " " + Chr(34), "", #PB_Program_Open)
					If MediaProgramm
						DisableGadget(#MovieCenter_01, 1)
						DisableGadget(#MovieCenter_02, 1)
						DisableGadget(#MovieCenter_03, 1)
					EndIf
					;             KillProgram("C:\Program Files (x86)\Windows Media Player\wmplayer.exe")
					;             CloseProgram(MediaProgramm)
				Case #MovieCenter_02 ; TV
					MediaButtonFocus = 2
					RunProgram("explorer.exe ", Chr(34) + "C:\Program Files (x86)\DVBViewer\dvbviewer.exe" + Chr(34), "");#PB_Program_Wait
				Case #MovieCenter_03 ; CLIP
					MediaButtonFocus = 3
					;             RunProgram("explorer.exe ",Chr(34)+ "%ProgramFiles(x86)%\Windows Media Player\wmplayer.exe' /prefetch:1"+Chr(34),"");#PB_Program_Wait
					MovieDateiname$ = "F:\Videos\MyMovies\After Earth\After Earth.flv"
					LoadMovie(#Movie, MovieDateiname$)
					PlayMovie(#Movie, WindowID)
					; ID = ScreenID()
				Case #MovieCenter_04 ; OFF
					If MediaProgramm
						hWnd = GetMediaPlayerHwnd(ProgramID(MediaProgramm))
						SendMessage_(hWnd, #WM_CLOSE, #Null, #Null)
					EndIf
					Break
			EndSelect
		Case #PB_Event_Menu
			Select EventMenu()
				Case 0
					If MediaProgramm
						hWnd = GetMediaPlayerHwnd(ProgramID(MediaProgramm))
						SendMessage_(hWnd, #WM_CLOSE, #Null, #Null)
					EndIf
					Break
			EndSelect
	EndSelect
ForEver

Re: Small Mediacenter

Verfasst: 25.12.2013 21:27
von Velindos
Hallo,
habe die Sache probiert, geht nicht. Denke es liegt daran das nach der Wahl des Movie der Windows Media Player den Focus hat.
1. Habe Codec überarbeitet mit Buttonsteuerung zum besseren Verständnis!
2. Wenn ich den OFF Button drücke möchte ich Windows herunterfahren, nur wie?

Gruss ... Velindos

Re: Small Mediacenter

Verfasst: 26.12.2013 01:57
von HeX0R
Velindos hat geschrieben:Hallo,
habe die Sache probiert, geht nicht. Denke es liegt daran das nach der Wahl des Movie der Windows Media Player den Focus hat.
Das wird wohl an Deiner Fernbedienung liegen, keine Ahnung was Du da treibst, mit Klicks auf die Buttons geht es jedenfalls.
Velindos hat geschrieben:1. Habe Codec überarbeitet mit Buttonsteuerung zum besseren Verständnis!
Code nicht Codec!

Re: Small Mediacenter

Verfasst: 26.12.2013 10:58
von uweb
Sorry, ich dachte es ginge um das Beenden des Media Players an sich und nicht darum die ESC-Taste abzufragen.
Dafür gibt es mehrere Lösungen.
Du könntest z.B. ein rahmenloses transparentes Fenster über den Media Player legen und damit die volle Kontrolle über Benutzereingaben erlangen.
Du könntest aber z.B. auch ein sehr kleines Fenster über den Media Player legen und damit das gleiche bewirken.
Einfacher wäre es mi RegisterHotKey_() die ESC-Taste (#PB_Shortcut_Escape) systemweit abzufragen - mit der Gefahr, dass gerade ein anderes Fenster den Focus hat.
So etwas ähnliches habe ich vor kurzem hier gemacht. Sicher gibt es aber auch noch andere Lösungen.

Die Lösung für "Windows herunterfahren" :
Suche im Board nach "Windows herunterfahren" und passe die gefunde Lösung an.
:-)


PS
Die OFF-Funktion von HeX0R ist besser als meine.

Re: Small Mediacenter

Verfasst: 26.12.2013 12:07
von Velindos
Hallo,
Danke für deinen Tip mit dem
rahmenloses transparentes Fenster
Wenn ich das richtig Verstehe, müsste ich dann den MSM Player innerhalb des Fenster aufrufen oder so.. werde die Sache mal studieren!

Für das "Windows beenden" habe ich folgenden Eintrag gefunden im Forum
;Windows beenden
RunProgram("C:\Windows\System32\shutdown.exe","-s -t 0 -f","",0)
Nochmals Danke und ein frohes Fest!

Gruss ... Velindos

Re: Small Mediacenter

Verfasst: 26.12.2013 13:35
von Kiffi
man kann den MediaPlayer übrigens auch prima via COMate einbinden und fernsteuern.

ein simples Beispiel:

Code: Alles auswählen

IncludePath "..\" ; Pfad anpassen

XIncludeFile "COMatePLUS.pbi"

MediaPlayer.COMateObject

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "MediaPlayer", #PB_Window_SystemMenu | #PB_Window_Invisible)

MediaPlayer = COMate_CreateActiveXControl(10, 10, 620, 460, "MediaPlayer.MediaPlayer.1")

If MediaPlayer
	
	MediaPlayer\Invoke("Open('[DeinFilm]')")
	
	HideWindow(0, 0)
	
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
			Case #PB_Event_CloseWindow
				Break
		EndSelect
	ForEver
	
	MediaPlayer\Release()
	
EndIf


Grüße ... Kiffi

Re: Small Mediacenter

Verfasst: 26.12.2013 19:40
von Velindos
Hallo Kiffi,
besten Dank für dein Script. Habe die Sache so eingefügt:
DeinFilm.s = "F:\Videos\MyTrailer\Der Wolkenatlas\HD-Trailer Der Wolkenatlas.mp4"
MediaPlayer\Invoke("Open(DeinFilm)")
Der Media Player startet, aber das Movie läuft nicht, keine Ahnung warum. Kann das an W8+64Bit liegen oder so?

Frohes Fest ... Velindos

PS: Bei COMatePlus wurde von mir nach FehlerMeldung das @ entfernt!

Re: Small Mediacenter

Verfasst: 26.12.2013 20:47
von Kiffi
Velindos hat geschrieben:keine Ahnung warum
simple Stringverknüpfung:
DeinFilm.s = "F:\Videos\MyTrailer\Der Wolkenatlas\HD-Trailer Der Wolkenatlas.mp4"
MediaPlayer\Invoke("Open(" + DeinFilm + ")")
Grüße ... Kiffi