Small Mediacenter

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Small Mediacenter

Beitrag 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
Zuletzt geändert von Velindos am 25.12.2013 21:23, insgesamt 1-mal geändert.
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Small Mediacenter

Beitrag 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
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Small Mediacenter

Beitrag 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
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Small Mediacenter

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Small Mediacenter

Beitrag 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!
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Small Mediacenter

Beitrag 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.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Small Mediacenter

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Small Mediacenter

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Small Mediacenter

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Small Mediacenter

Beitrag 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
a²+b²=mc²
Antworten