VB.NET-Tipp 0134: Windows Media Player Visualisierungen im eigenen Programm verwenden
von Frank Schüler
Beschreibung
Dieses Beispiel zeigt unter Verwendung der Schnittstellen IWMPEffects und IWMPEffects2 wie die Visualisierungen des Windows Media Player im eigenen Programm verwendet werden können.
Wichtig: Die Visualisierungen, die in der WMPLOC.DLL enthalten sind, können mit diesem Beispiel nicht geladen und angezeigt werden.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Compact Framework 1.0, .NET Compact Framework 2.0, .NET Framework 4 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008, Visual Basic 2010 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2005 ' Option Strict: An ' ' Referenzen: ' - System ' - System.Data ' - System.Deployment ' - System.Drawing ' - System.Windows.Forms ' - System.Xml ' ' Imports: ' - Microsoft.VisualBasic ' - System ' - System.Collections ' - System.Collections.Generic ' - System.Data ' - System.Drawing ' - System.Diagnostics ' - System.Windows.Forms ' ' ############################################################################## ' ################################# Form1.vb ################################### ' ############################################################################## Option Strict On Option Explicit On Imports Microsoft.Win32 Public Class Form1 Private Const EffectsRoot As String = _ "SOFTWARE\Microsoft\MediaPlayer\Objects\Effects" Private Structure InstWmpVis Dim VisName As String Dim ClassID As Guid End Structure Private rnd As New Random() Private bolRenderWin As Boolean = False Private cVis As New WmpVisual Private tRect As New WmpVisual.RECT Private tTimedLevel As New WmpVisual.TimedLevel Private bDummyFreq As Byte() = New Byte(WmpVisual.SA_BUFFER_SIZE - 1) {} Private bDummyWave As Byte() = New Byte(WmpVisual.SA_BUFFER_SIZE - 1) {} Private tInstWmpVis As InstWmpVis() = New InstWmpVis() {} Private Sub Form1_FormClosed(ByVal sender As Object, _ ByVal e As System.Windows.Forms.FormClosedEventArgs) _ Handles Me.FormClosed ' Timer stoppen Timer1.Enabled = False ' Ist ein Renderfenster vorhanden? If bolRenderWin = True Then ' Renderfenster löschen If cVis.Destroy = True Then bolRenderWin = False End If End If ' Visualisierung entladen cVis.DestroyVis() ' Klasse cVis = Nothing End Sub Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load cmdPropPage.Enabled = False cmdPropPage.Text = "Show Propertypage" cmdPresetDown.Enabled = False cmdPresetDown.Text = "<< Preset" cmdPresetUp.Enabled = False cmdPresetUp.Text = "Preset >>" ' RegistryKey, wo die Visualisierungen aufgelistet sind, öffnen Using VisRoot As RegistryKey = _ Registry.LocalMachine.OpenSubKey(EffectsRoot) ' alle SubKeys auslesen Dim VisSubKeyNames As String() = VisRoot.GetSubKeyNames() ' Anzahl der SubKeys auslesen Dim VisCount As Integer = VisRoot.SubKeyCount ' Array zur Aufnahme der Werte dimensionieren Array.Resize(tInstWmpVis, VisCount) ' alle Visualisierungen auslesen For VisItem As Integer = 0 To VisCount - 1 ' Name der Visualisierung auslesen tInstWmpVis(VisItem).VisName = VisSubKeyNames(VisItem) ' Name in die ComboBox einfügen cbInstVis.Items.Add(VisSubKeyNames(VisItem)) ' RegistryKey, wo die ClassID der Visualisierungen ist, öffnen Using VisProp As RegistryKey = _ Registry.LocalMachine.OpenSubKey( _ EffectsRoot & "\" & VisSubKeyNames(VisItem) & _ "\Properties") ' ClassID auslesen tInstWmpVis(VisItem).ClassID = _ New Guid(VisProp.GetValue("classid").ToString) End Using Next End Using ' Erste Visualisierung selektieren cbInstVis.SelectedIndex = 0 End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Timer1.Tick ' Nur symbolisch ein paar Zufallsdaten generieren die in der ' Visualisierung angezeigt werden sollen. Normalerweise würden die ' Daten vom WMP kommen. Hier müssen wir uns aber selbst um das befüllen ' der Daten kümmern. Zum Beispiel könnte man sich die Daten per ' waveInAddBuffer von der Soundkarte holen. rnd.NextBytes(bDummyFreq) rnd.NextBytes(bDummyWave) ' Genaue Informationen welche Daten in der Struktur TimedLevel, speziell ' für Frequency und Waveform, erwartet werden, findet man in der ' MSDN unter ' http://msdn.microsoft.com/en-us/library/dd564504%28VS.85%29.aspx ' TimedLevel Struktur füllen With tTimedLevel .State = WmpVisual.PlayerState.Play_State .Frequency.Data0 = bDummyFreq .Frequency.Data1 = bDummyFreq .Waveform.Data0 = bDummyWave .Waveform.Data1 = bDummyWave End With ' Timer stoppen damit die Visualisierung Zeit bekommt die Daten ' zu rendern Timer1.Enabled = False ' ist ein Renderfenster vorhanden (IWmpEffects2) If bolRenderWin = True Then ' Visualisierung mit IWmpEffects2 auf dem Fenster rendern If cVis.RenderWindowed(tTimedLevel, True) = True Then ' war das Rendern erfolgreich, dann Timer wieder starten ' um die nächsten Daten zu rendern Timer1.Enabled = True End If Else ' ansonsten mit IWmpEffects rendern ' Rect Struktur füllen ' Größe und Position der Renderausgabe With tRect .Left = 0 .Top = 0 .Right = pbRenderVis.Size.Width .Bottom = pbRenderVis.Size.Height End With ' Visualisierung mit IWmpEffects auf dem Fenster rendern If cVis.Render(tTimedLevel, pbRenderVis.Handle, tRect) = True Then ' war das Rendern erfolgreich, dann Timer wieder starten ' um die nächsten Daten zu rendern Timer1.Enabled = True End If End If End Sub Private Sub cmdPropPage_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPropPage.Click ' Einstellungsfenster der Visualisierung anzeigen cVis.DisplayPropertyPage(Me.Handle) End Sub Private Sub cmdPresetUp_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPresetUp.Click ' ist die Nummer des aktuellen Preset kleiner der vorhandenen Presets If cVis.GetCurrentPreset < cVis.GetPresetCount - 1 Then ' Button aktivieren cmdPresetDown.Enabled = True ' nächsten Preset anzeigen If cVis.SetCurrentPreset(cVis.GetCurrentPreset + 1) = True Then ' ist die Nummer des aktuellen Preset gleich der ' vorhandenen Presets If cVis.GetCurrentPreset = cVis.GetPresetCount - 1 Then ' Button deaktivieren cmdPresetUp.Enabled = False End If End If Else ' Button aktivieren cmdPresetUp.Enabled = True End If ' Anzeigen des aktuellen Presetnamen und die Anzahl der ' vorhandenen Presets SetLblPresetName() End Sub Private Sub cmdPresetDown_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPresetDown.Click ' ist die aktuelle Presetnummer größer 0 If cVis.GetCurrentPreset > 0 Then ' Button aktivieren cmdPresetUp.Enabled = True ' vorhergehenden Preset anzeigen If cVis.SetCurrentPreset(cVis.GetCurrentPreset - 1) = True Then ' ist die aktuelle Presetnummer gleich 0 If cVis.GetCurrentPreset = 0 Then ' Button deaktivieren cmdPresetDown.Enabled = False End If End If Else ' Button aktivieren cmdPresetDown.Enabled = True End If ' Anzeigen des aktuellen Presetnamen und die Anzahl der ' vorhandenen Presets SetLblPresetName() End Sub Private Sub SetLblPresetName() ' Anzeigen des aktuellen Presetnamen und die Anzahl der ' vorhandenen Presets lblPresetName.Text = cVis.GetPresetTitle(cVis.GetCurrentPreset) & _ " [Preset " & (cVis.GetCurrentPreset + 1).ToString & _ " von " & cVis.GetPresetCount.ToString & "]" End Sub Private Sub cbInstVis_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles cbInstVis.SelectedIndexChanged ' Timer stoppen Timer1.Enabled = False ' ist ein Renderfenster vorhnden If bolRenderWin = True Then ' Renderfenster löschen If cVis.Destroy = True Then bolRenderWin = False End If End If ' Visualisierung entladen cVis.DestroyVis() cmdPropPage.Enabled = False cmdPresetDown.Enabled = False cmdPresetUp.Enabled = False ' Visualisierung initialisieren ' Was nicht geht sind die Visualisierungen aus der wmploc.dll. If cVis.InitVis( _ tInstWmpVis(cbInstVis.SelectedIndex).ClassID) = True Then ' Titel der Visualisierung auslesen Me.Text = cVis.GetTitle ' Ein Visualisierungsobjekt kann mehrere unterschiedliche ' Visualisierungen enthalten. Diese werden Presets genannt. ' sind mehrere Presets vorhanden If cVis.GetPresetCount - 1 > 0 Then ' dann den Button PresetUp aktivieren cmdPresetUp.Enabled = True End If ' besitzt diese Visualisierung ein Einstellungsfenster If (cVis.GetCapabilities And _ WmpVisual.Capabilities.EFFECT_HASPROPERTYPAGE) = _ WmpVisual.Capabilities.EFFECT_HASPROPERTYPAGE Then ' dann Button PropPage aktivieren cmdPropPage.Enabled = True End If ' Anzeigen des aktuellen Presetnamen und die Anzahl der ' vorhandenen Presets SetLblPresetName() ' unterstützt die Visualisierung das Interface IWmpEffects2 If cVis.UsedIWmpEffects2 = True Then ' dann verwenden wir auch die Möglichkeiten dieses Interfaces ' ein Renderfenster erstellen bolRenderWin = cVis.Create(pbRenderVis.Handle) End If ' Timer starten Timer1.Interval = 25 Timer1.Enabled = True Else pbRenderVis.Invalidate() lblPresetName.Text = _ "Diese Visualisierung lässt sich nicht anzeigen." Me.Text = "Error" End If End Sub End Class ' ############################################################################## ' ############################### WmpVisual.vb ################################# ' ############################################################################## Option Strict On Option Explicit On Imports System.Runtime.InteropServices Public Class WmpVisual Public Const SA_BUFFER_SIZE As Integer = 1024 Private Const TimedLevelMaxFrequency As Single = 22050 Private Const TimedLevelMinFrequency As Single = 20 Private Const S_OK As Integer = 0 Private Const CLSCTX_INPROC_SERVER As Integer = 1 Private IID_IUnknown As New Guid("00000000-0000-0000-C000-000000000046") Private WmpVis As Object = Nothing ' Visualisierungs-Objekt Private Effects As IWmpEffects ' Interface IWmpEffects Private Effects2 As IWmpEffects2 ' Interface IWmpEffects2 <DllImport("ole32.dll", EntryPoint:="CoCreateInstance")> _ Private Shared Function CoCreateInstance(ByRef clsid As Guid, _ <MarshalAs(UnmanagedType.IUnknown)> ByVal inner As Object, _ ByVal context As Integer, ByRef uuid As Guid, _ <MarshalAs(UnmanagedType.IUnknown)> _ ByRef rReturnedComObject As Object) As Integer End Function <DllImport("user32.dll", EntryPoint:="GetDC")> _ Private Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr End Function <DllImport("user32.dll", EntryPoint:="ReleaseDC")> _ Private Shared Function ReleaseDC(ByVal hwnd As IntPtr, _ ByVal hdc As IntPtr) As Integer End Function ''' <summary> ''' Übergabewerte für dem Member State in der Struktur TimedLevel ''' </summary> ''' <remarks> ''' http://msdn.microsoft.com/en-us/library/dd564012%28VS.85%29.aspx ''' </remarks> Public Enum PlayerState As Integer Stop_State = 0 Pause_State = 1 Play_State = 2 End Enum ''' <summary> ''' Rückgabewerte der Funktion GetCapabilities ''' </summary> ''' <remarks> ''' http://msdn.microsoft.com/en-us/library/dd563262%28VS.85%29.aspx ''' </remarks> Public Enum Capabilities As Integer EFFECT_CANGOFULLSCREEN = &H1 EFFECT_HASPROPERTYPAGE = &H2 EFFECT_VARIABLEFREQSTEP = &H4 EFFECT_WINDOWED_ONLY = &H8 EFFECT2_FULLSCREENEXCLUSIVE = &H10 End Enum ''' <summary> ''' Wird benötigt um die Position und Größe des Visualisierungsfensters ''' festzulegen, z.B. für die Funktion Render ''' </summary> <StructLayout(LayoutKind.Sequential)> _ Public Structure RECT Public Left As Integer Public Top As Integer Public Right As Integer Public Bottom As Integer End Structure ''' <summary> ''' Hilfsstruktur für TimedLevel als Ersatz für die zweidimensionalen Arrays ''' In VBC würde die Struktur TimedLevel so auschauen ''' Type TimedLevel ''' Frequency(1, SA_BUFFER_SIZE - 1) As Byte ''' Waveform(1, SA_BUFFER_SIZE - 1) As Byte ''' State As Long ' Enum PlayerState ''' TimeStamp As Currency ' Type LARGE_INTEGER ''' End Type ''' </summary> <StructLayout(LayoutKind.Sequential)> _ Public Structure Data <MarshalAs(UnmanagedType.ByValArray, SizeConst:=SA_BUFFER_SIZE)> _ Public Data0() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=SA_BUFFER_SIZE)> _ Public Data1() As Byte End Structure ''' <summary> ''' Nimmt die Daten auf die dann gerendert werden sollen. ''' </summary> ''' <remarks> ''' http://msdn.microsoft.com/en-us/library/dd564504%28VS.85%29.aspx ''' </remarks> <StructLayout(LayoutKind.Sequential)> _ Public Structure TimedLevel Public Frequency As Data Public Waveform As Data Public State As PlayerState Public TimeStamp As Int64 End Structure ''' <summary> ''' Interface IWmpEffects ''' </summary> ''' <remarks> ''' http://msdn.microsoft.com/en-us/library/dd563253%28VS.85%29.aspx ''' </remarks> <Guid("D3984C13-C3CB-48e2-8BE5-5168340B4F35")> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ Public Interface IWmpEffects Function Render(ByRef pLevels As TimedLevel, ByVal Hdc As IntPtr, _ ByRef pRC As RECT) As Integer Function MediaInfo(ByVal lChannelCount As Integer, _ ByVal lSampleRate As Integer, _ ByVal bstrTitle As String) As Integer Function GetCapabilities(ByRef pdwCapabilities As Integer) As Integer Function GetTitle(ByRef bstrTitle As String) As Integer Function GetPresetTitle(ByVal nPreset As Integer, _ ByRef bstrPresetTitle As String) As Integer Function GetPresetCount(ByRef count As Integer) As Integer Function SetCurrentPreset(ByVal currentpreset As Integer) As Integer Function GetCurrentPreset(ByRef currentpreset As Integer) As Integer Function DisplayPropertyPage(ByVal hwndOwner As IntPtr) As Integer Function GoFullScreen(ByVal fFullscreen As Boolean) As Integer Function RenderFullScreen(ByRef pLevels As TimedLevel) As Integer End Interface ''' <summary> ''' Interface IWmpEffects2 ''' </summary> ''' <remarks> ''' http://msdn.microsoft.com/en-us/library/dd563254%28VS.85%29.aspx ''' </remarks> <Guid("695386EC-AA3C-4618-A5E1-DD9A8B987632")> _ <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _ Public Interface IWmpEffects2 Inherits IWmpEffects Shadows Function Render(ByRef pLevels As TimedLevel, _ ByVal Hdc As IntPtr, ByRef pRC As RECT) As Integer Shadows Function MediaInfo(ByVal lChannelCount As Integer, _ ByVal lSampleRate As Integer, ByVal bstrTitle As String) As Integer Shadows Function GetCapabilities( _ ByRef pdwCapabilities As Integer) As Integer Shadows Function GetTitle(ByRef bstrTitle As String) As Integer Shadows Function GetPresetTitle(ByVal nPreset As Integer, _ ByRef bstrPresetTitle As String) As Integer Shadows Function GetPresetCount(ByRef count As Integer) As Integer Shadows Function SetCurrentPreset( _ ByVal currentpreset As Integer) As Integer Shadows Function GetCurrentPreset( _ ByRef currentpreset As Integer) As Integer Shadows Function DisplayPropertyPage( _ ByVal hwndOwner As IntPtr) As Integer Shadows Function GoFullScreen(ByVal fFullscreen As Boolean) As Integer Shadows Function RenderFullScreen( _ ByRef pLevels As TimedLevel) As Integer Function SetCore(ByVal pPlayer As IntPtr) As Integer Function Create(ByVal hwndParent As IntPtr) As Integer Function Destroy() As Integer Function NotifyNewMedia(ByVal pMedia As IntPtr) As Integer Function OnWindowMessage(ByVal Msg As Integer, _ ByVal WParam As Integer, ByVal LParam As Integer, _ ByRef plResultParam As Integer) As Integer Function RenderWindowed(ByRef pData As TimedLevel, _ ByVal fRequiredRender As Boolean) As Integer End Interface ''' <summary> ''' Lädt und initialisiert eine Visualisierung ''' </summary> ''' <param name="VisGUID">GUID einer Visualisierung</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> Public Function InitVis(ByVal VisGUID As Guid) As Boolean If WmpVis Is Nothing Then ' Visualisierung erstellen If CoCreateInstance(VisGUID, Nothing, _ CLSCTX_INPROC_SERVER, IID_IUnknown, WmpVis) = S_OK Then ' Versuch auf IWmpEffects zu casten. Bei einem Fehlschlag, ' wird Nothing zurück gegeben und das Objekt WmpVis ' unterstützt das Interface IWmpEffects nicht. Effects = TryCast(WmpVis, IWmpEffects) If Effects IsNot Nothing Then ' Versuch auf IWmpEffects2 zu casten. Bei einem Fehlschlag, ' wird Nothing zurück gegeben und das Objekt WmpVis ' unterstützt das Interface IWmpEffects2 nicht. Effects2 = TryCast(WmpVis, IWmpEffects2) ' wird das Interface IWmpEffects2 unterstützt, brauchen ' wir das Interface IWmpEffects nicht mehr. If Effects2 IsNot Nothing Then Effects = Nothing End If ' Erstes Preset setzen. Das muss sein da es ansonsten bei ' einigen Visualisierungen zu einer AccessViolationException ' führt. Me.SetCurrentPreset(0) InitVis = True End If End If End If End Function ''' <summary> ''' mit InitVis initialisierte Visualisierung löschen ''' </summary> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> Public Function DestroyVis() As Boolean ' ist ein Visualisierungs-Objekt vorhanden If WmpVis IsNot Nothing Then ' dann freigeben If Marshal.FinalReleaseComObject(WmpVis) = 0 Then If Effects2 IsNot Nothing Then Effects2 = Nothing End If If Effects IsNot Nothing Then Effects = Nothing End If WmpVis = Nothing DestroyVis = True End If End If End Function ''' <summary> ''' Ermittelt ob die Visualisierung das Interface IWmpEffects2 unterstützt ''' </summary> ''' <returns> ''' True = wird unterstützt / False = wird nicht unterstützt ''' </returns> Public Function UsedIWmpEffects2() As Boolean If Effects2 IsNot Nothing Then UsedIWmpEffects2 = True End If End Function ''' <summary> ''' Rendert die Visualisierung auf ein Fenster ''' </summary> ''' <param name="pLevels">Struktur TimedLevel</param> ''' <param name="hwndParent">Handle eines Fensters</param> ''' <param name="pRC">Struktur RECT</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function Render(ByRef pLevels As TimedLevel, _ ByVal hwndParent As IntPtr, _ ByRef pRC As RECT) As Boolean ' einen DC vom Handle holen Dim dcParent As IntPtr = GetDC(hwndParent) ' ist ein DC vorhanden If dcParent <> IntPtr.Zero Then ' wenn nicht das Interface IWmpEffects2 unterstützt wird If Effects2 Is Nothing Then ' dann Funktion aus IWmpEffects verwenden If Effects.Render(pLevels, dcParent, pRC) = S_OK Then Render = True End If Else ' wenn doch, dann Funktion aus IWmpEffects2 verwenden If Effects2.Render(pLevels, dcParent, pRC) = S_OK Then Render = True End If End If ' DC freigeben ReleaseDC(hwndParent, dcParent) End If End Function ''' <summary> ''' Sendet die Anzahl der Kanäle,Samplerate und einen Text an die ''' Visualisierung ''' </summary> ''' <param name="lChannelCount"> ''' Anzahl der Kanäle(1 für Mono, 2 für Stereo) ''' </param> ''' <param name="lSampleRate"> ''' Samplerate in Hertz (Hz). Bsp. 22500 = 22.5KHz ''' </param> ''' <param name="bstrTitle">einen Text</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function MediaInfo(ByVal lChannelCount As Integer, _ ByVal lSampleRate As Integer, ByVal bstrTitle As String) As Boolean If Effects2 Is Nothing Then If Effects.MediaInfo(lChannelCount, lSampleRate, _ bstrTitle) = S_OK Then MediaInfo = True End If Else If Effects2.MediaInfo(lChannelCount, lSampleRate, _ bstrTitle) = S_OK Then MediaInfo = True End If End If End Function ''' <summary> ''' Eigenschaften der Visualisierung auslesen ''' </summary> ''' <returns>Enum Capabilities</returns> ''' <remarks>IWmpEffects</remarks> Public Function GetCapabilities() As Integer Dim intRet As Integer = -1 If Effects2 Is Nothing Then If Effects.GetCapabilities(intRet) = S_OK Then GetCapabilities = intRet End If Else If Effects2.GetCapabilities(intRet) = S_OK Then GetCapabilities = intRet End If End If End Function ''' <summary> ''' Namen der Visualisierung auslesen ''' </summary> ''' <returns>Name der Visualisierung</returns> ''' <remarks>IWmpEffects</remarks> Public Function GetTitle() As String Dim strRet As String = "" If Effects2 Is Nothing Then If Effects.GetTitle(strRet) = S_OK Then GetTitle = strRet Else GetTitle = "" End If Else If Effects2.GetTitle(strRet) = S_OK Then GetTitle = strRet Else GetTitle = "" End If End If End Function ''' <summary> ''' Namen des aktuellen Presets auslesen ''' </summary> ''' <param name="nPreset">Presetnummer</param> ''' <returns>Name des Preset</returns> ''' <remarks>IWmpEffects</remarks> Public Function GetPresetTitle(ByVal nPreset As Integer) As String Dim strRet As String = "" If Effects2 Is Nothing Then If Effects.GetPresetTitle(nPreset, strRet) = S_OK Then GetPresetTitle = strRet Else GetPresetTitle = "" End If Else If Effects2.GetPresetTitle(nPreset, strRet) = S_OK Then GetPresetTitle = strRet Else GetPresetTitle = "" End If End If End Function ''' <summary> ''' Anzahl der vorhandenen Presets in der Visualisierung auslesen ''' </summary> ''' <returns>Anzahl der vorhandenen Presets</returns> ''' <remarks>IWmpEffects</remarks> Public Function GetPresetCount() As Integer Dim intRet As Integer = -1 If Effects2 Is Nothing Then If Effects.GetPresetCount(intRet) = S_OK Then GetPresetCount = intRet End If Else If Effects2.GetPresetCount(intRet) = S_OK Then GetPresetCount = intRet End If End If End Function ''' <summary> ''' Setzt den Preset einer Visualisierung ''' </summary> ''' <param name="currentpreset">Presetnummer</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function SetCurrentPreset(ByVal currentpreset As Integer) As Boolean If Effects2 Is Nothing Then If Effects.SetCurrentPreset(currentpreset) = S_OK Then SetCurrentPreset = True End If Else If Effects2.SetCurrentPreset(currentpreset) = S_OK Then SetCurrentPreset = True End If End If End Function ''' <summary> ''' Aktuelle Presetnummer der Visualisierung auslesen ''' </summary> ''' <returns>aktuelle Presetnummer</returns> ''' <remarks>IWMPEffects</remarks> Public Function GetCurrentPreset() As Integer Dim intRet As Integer = -1 If Effects2 Is Nothing Then If Effects.GetCurrentPreset(intRet) = S_OK Then GetCurrentPreset = intRet End If Else If Effects2.GetCurrentPreset(intRet) = S_OK Then GetCurrentPreset = intRet End If End If End Function ''' <summary> ''' Öffnet das Einstellungsfenster der Visualisierung wenn vorhanden. ''' </summary> ''' <param name="hwndOwner">Handle eines Fensters</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function DisplayPropertyPage(ByVal hwndOwner As IntPtr) As Boolean If Effects2 Is Nothing Then If Effects.DisplayPropertyPage(hwndOwner) = S_OK Then DisplayPropertyPage = True End If Else If Effects2.DisplayPropertyPage(hwndOwner) = S_OK Then DisplayPropertyPage = True End If End If End Function ''' <summary> ''' Schaltet die Visualisierung in den Vollbildmodus wenn unterstützt ''' </summary> ''' <param name="fFullscreen"> ''' True = Vollbildmodus / False = Fenstermodus ''' </param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function GoFullScreen(ByVal fFullscreen As Boolean) As Boolean If Effects2 Is Nothing Then If Effects.GoFullScreen(fFullscreen) = S_OK Then GoFullScreen = True End If Else If Effects2.GoFullScreen(fFullscreen) = S_OK Then GoFullScreen = True End If End If End Function ''' <summary> ''' Rendert die Visualisierung im Vollbildmodus ''' </summary> ''' <param name="pLevels">Struktur TimedLevel</param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects</remarks> Public Function RenderFullScreen(ByRef pLevels As TimedLevel) As Boolean If Effects2 Is Nothing Then If Effects.RenderFullScreen(pLevels) = S_OK Then RenderFullScreen = True End If Else If Effects2.RenderFullScreen(pLevels) = S_OK Then RenderFullScreen = True End If End If End Function ''' <summary> ''' Ermöglicht den Zugriff auf die Windows Media Player APIs ''' </summary> ''' <param name="pPlayer"> ''' normalerweise ein Pointer auf ein IWMPCore Interface ''' </param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects2</remarks> Public Function SetCore(ByVal pPlayer As IntPtr) As Boolean ' nur wenn die Visualisierung das Interface IWmpEffects2 unterstützt If Effects2 IsNot Nothing Then If Effects2.SetCore(pPlayer) = S_OK Then SetCore = True End If End If End Function ''' <summary> ''' Erstellt ein Visualisierungsfenster ''' </summary> ''' <param name="hwndParent"> ''' Handle eines Fensters, auf dem die Visualisierung ''' angezeigt werden soll. ''' </param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects2</remarks> Public Function Create(ByVal hwndParent As IntPtr) As Boolean If Effects2 IsNot Nothing Then If Effects2.Create(hwndParent) = S_OK Then Create = True End If End If End Function ''' <summary> ''' Das Visualisierungsfenster, das mit Create erstellt wurde, löschen. ''' </summary> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects2</remarks> Public Function Destroy() As Boolean If Effects2 IsNot Nothing Then If Effects2.Destroy = S_OK Then Destroy = True End If End If End Function ''' <summary> ''' Informiert die Visualisierung das ein neues Media-Objekt geladen wurde ''' </summary> ''' <param name="pMedia"> ''' normalerweise einen Pointer auf ein IWMPMedia Interface ''' </param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects2</remarks> Public Function NotifyNewMedia(ByVal pMedia As IntPtr) As Boolean If Effects2 IsNot Nothing Then If Effects2.NotifyNewMedia(pMedia) = S_OK Then NotifyNewMedia = True End If End If End Function ''' <summary> ''' Sendet Nachrichten an das Visualisierungsfenster ''' </summary> ''' <param name="Msg">Message</param> ''' <param name="WParam">WParam</param> ''' <param name="LParam">LParam</param> ''' <returns>Rückgabewert der Funktion</returns> ''' <remarks>IWmpEffects2</remarks> Public Function OnWindowMessage(ByVal Msg As Integer, _ ByVal WParam As Integer, ByVal LParam As Integer) As Integer Dim intRet As New Integer If Effects2 IsNot Nothing Then If Effects2.OnWindowMessage(Msg, WParam, LParam, intRet) = S_OK Then OnWindowMessage = intRet End If End If End Function ''' <summary> ''' Rendert eine Windowed Visualisierung ''' </summary> ''' <param name="pData">Struktur TimedLevel</param> ''' <param name="fRequiredRender"> ''' True = muss sich selbst neu zeichnen / ''' False = muss sich nicht selbst neu zeichnen ''' </param> ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns> ''' <remarks>IWmpEffects2</remarks> Public Function RenderWindowed(ByRef pData As TimedLevel, _ ByVal fRequiredRender As Boolean) As Boolean If Effects2 IsNot Nothing Then If Effects2.RenderWindowed(pData, fRequiredRender) = S_OK Then RenderWindowed = True End If End If End Function ''' <summary> ''' Umrechnung einer Frequenz zu einem Index für den Member Frequency ''' in der Struktur TimedLefel ''' </summary> ''' <param name="Freq">Frequenz: min 20 Hz / max 22050 Hz</param> ''' <returns> ''' Index für den Member Frequency in der Struktur TimedLefel ''' </returns> Public Function Frequency_Index(ByVal Freq As Single) As Integer Frequency_Index = CInt((Freq - TimedLevelMinFrequency) / (( _ TimedLevelMaxFrequency - TimedLevelMinFrequency) / _ SA_BUFFER_SIZE)) End Function End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Frank Schüler am 10.08.2011 um 07:28
Hallo Roland
Sorry das ich Deine Frage erst jetzt entdeckt habe. Aber besser spät als nie. ;-)
Wie in den Kommentaren zum Code zu lesen reagiert die Visualisierung hier nicht auf gerade abgespielte Sounds. Dies funktioniert nur wenn die Visualisierung direkt im WMP aufgerufen wird. In diesem Bsp., wo die Visualisierung außerhalb des WMP läuft, muss man sich selbst um das befüllen der Struktur TimedLevel kümmern. Alles wichtige zur Struktur TimedLevel und wie die Daten vorliegen müssen findest Du in der MSDN.
Mfg Frank
Kommentar von Roland am 08.07.2010 um 11:02
Hallo,
ich habe den Quellcode in ein Programm von mir übernommen.
Ich muss sagen, das ist spitze. Nur habe ich eine Frage wo ich nicht weiterkomme.
Die Visualisierung reagiert nicht auf Sounds. Wenn ich den Code richtig gelesen habe sollte dies aber funktionieren.
Meine Frage: Was muss ich am Code eintragen um diesen Effekt zu erzielen bzw. sind die genannten parameter der Hrz Zahlen doch zuständig. Wie müssen diese eingetragen werden?
Über eine Antwort freue ich mich.
Gruß, Roland