| Autor |
Beitrag |
rud
Hält's aus hier
Beiträge: 5
WinXP,OpenSuSe10
D7P,PHP,Java
|
Verfasst: So 11.01.09 14:54
Hi
nach stundenlangem google hab ich nirgendwo eine brauchbare lösung für mein problem gefunden, deshalb wende ich mich jetzt an euch.
Ich möchte eine Konsolenanwendung schreiben, mit der ich den gestarteten WMP kontrollieren kann. Dafür habe ich die Typebib. "WMPLib_TLB" erstellt und wollte nun mit folgendem code auf den WMP zugreifen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| program Project1;
{$APPTYPE CONSOLE}
uses ActiveX, windows, WMPLib_TLB in '..\..\..\Imports\WMPLib_TLB.pas';
var wmp:TWindowsMediaPlayer; h:hWnd;
begin CoInitialize(nil); h := FindWindow('WMPlayerApp', 'Windows Media Player'); wmp.CreateParented(h); CoUnInitialize; end. |
das birngt mir zwar beim compilieren keinen fehler aber beim ausführen stürzt das programm mit folgendem Fehler ab:
ich hoffe ihr könnt mir weiterhelfen. mit itunes habe ich alles noch allein geschafft XD
mfg rud
|
|
Gausi
      
Beiträge: 8553
Erhaltene Danke: 479
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 11.01.09 15:06
Hallo und  in der Entwickler-Ecke!
Probier es mal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var wmp:TWindowsMediaPlayer; h:hWnd;
begin CoInitialize(nil); h := FindWindow('WMPlayerApp', 'Windows Media Player'); wmp := TWindowsMediaPlayer.CreateParented(h); CoUnInitialize; end. |
_________________ We are, we were and will not be.
|
|
rud 
Hält's aus hier
Beiträge: 5
WinXP,OpenSuSe10
D7P,PHP,Java
|
Verfasst: So 11.01.09 15:21
ja so hat es funktioniert XD
komischer weise hatte ich das selber schon mal so
trotzdem geht der zugriff so noch nicht reibungslos.
Delphi-Quelltext 1:
| writeln(wmp.versioninfo); |
gibt zwar die richtige version aus und das programm läuft ohne fehler durch, aber
Delphi-Quelltext 1:
| writeln(wmp.currentMedia.name); |
gibt wieder einen fehler aus,obwohl gerade ein song gespielt wird
Quelltext 1: 2: 3:
| Exception EAccessViolation in Modul Project1.exe bei 0005BEB8. Zugriffsverletzung bei Adresse 0045BEB8 in Modul 'Project1.exe'. Lesen von Adres se 00000000. |
PS:
www.delphipraxis.net...st781146.html#781146
ist mir durchaus bekannt, aber damit kann man keine infos auslesen soweit ich weiß. und wie sieht es da mit Shuffle bzw. Repeat aus?
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 12.01.09 10:41
Die Exception zeigt deutlich, dass CurrentMedia nil ist. (Lesen von Adresse 00000000)
Der Grund ist, dass CreateParented nicht zu einem offenen MediaPlayer verbindet. Ich lese jedenfalls nichts in der Doku was darauf hindeutet.
Du erstellt da einfach nur ein WMP-Objekt in dem Clientfenster, aber du übernimmst nicht die Kontrolle über eine laufende Instanz.
|
|
rud 
Hält's aus hier
Beiträge: 5
WinXP,OpenSuSe10
D7P,PHP,Java
|
Verfasst: Mo 12.01.09 14:01
und wie nehm ich dann bezug auf die laufende instanz?
kenn mich damit nicht so aus. bie itunes gibt es dafür ein COMInterface ( developer.apple.com/sdk/) was sich mit delphi leicht nutzen lässt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| program Project2;
{$APPTYPE CONSOLE}
uses ActiveX, iTunesLib_TLB in '..\..\..\Imports\iTunesLib_TLB.pas';
var itunes : iitunes; vol:integer;
begin CoInitialize(nil); iTunes := COitunesapp.Create;
if ParamCount > 0 then begin if paramstr(1) = '-playpause' then itunes.PlayPause else if paramstr(1) = '-stop' then itunes.Stop else if paramstr(1) = '-next' then itunes.NextTrack else if paramstr(1) = '-previous' then itunes.PreviousTrack else if paramstr(1) = '-quit' then itunes.Quit else if paramstr(1) = '-rand' then begin if itunes.CurrentPlaylist.Shuffle = false then itunes.CurrentPlaylist.Shuffle := true else itunes.CurrentPlaylist.Shuffle := false; end else if (paramstr(1) = '-repeat') AND (paramcount > 1) then begin if paramstr(2) = '-N' then itunes.CurrentPlaylist.SongRepeat := 0; if paramstr(2) = '-S' then itunes.CurrentPlaylist.SongRepeat := 1; if paramstr(2) = '-P' then itunes.CurrentPlaylist.SongRepeat := 2; end else if (paramstr(1) = '-volume') AND (paramcount > 1) then begin vol := itunes.SoundVolume; if paramstr(2) = '+' then inc(vol); if paramstr(2) = '-' then dec(vol); if vol > 100 then vol := 100; if vol < 0 then vol := 0; itunes.SoundVolume := vol; end else if paramstr(1) = '-mute' then begin if itunes.Mute = false then itunes.Mute := true else itunes.Mute := false; end else if paramstr(1) = '-current' then begin writeln(itunes.CurrentTrack.Name); end; end;
CoUnInitialize; end. |
genau die funktionen möchte ich jetzt auch für den WMP umsetzen. hat da jem. ne idee?
Benötigen tu ich dafür ein Projekt mit welchem ich mediaplayer vom handy aus steuern möchte.
mfg rud
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 12.01.09 14:39
Warum muss es denn der externe sein, warum baust du den nicht einfach in ein Projekt ein?
So einfach wird das nicht, die Standardfunktionen wie Pause und Weiter und so kann man natürlich machen, das geht ja meistens über die Multimediatasten, aber so einen Zugriff wird auf einen vom Benutzer gestarteten nicht machbar sein vermute ich.
Möglich wird das vermutlich mit einem Addon wie es der Windows Live Messenger zur Statusanzeige des aktuell gespielten Stücks benutzt.
|
|
rud 
Hält's aus hier
Beiträge: 5
WinXP,OpenSuSe10
D7P,PHP,Java
|
Verfasst: Mo 12.01.09 15:42
bei dem projekt an dem ich arbeite läuft auf dem rechner sein server (in java geschrieben), der befehle ausführt (z.b. *.bat starten oder exe starten). auf dem handy läuft der client, der die befehle an den server schickt. nun will ich damit die mediaplayer steuern und nicht einen neuen player starten. bei itunes hat das auch einwandfrei funktionirt und soweit ich weis ist es auch möglich die laufende instanz von winamp zu steuern.
wäre sehr schade wenn das beim WMP nicht gehn würde, bei itunes kann man sogut wie alles (sogar über JScript) machen.
Wenn es über ein addon mgl. sein könnte, könntest du mir das sagen wo ich informationen finde, wie ich ein solches add on erstelle? MSDN ist etwas zu umfangreich um da ohne viel arbeit was zu finden, deshabl frag ich mal schnell
mfg rud
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 12.01.09 15:45
Da hilft dir das Windows Media Player SDK:
msdn.microsoft.com/e...ibrary/aa393415.aspx
Mit Visual Studio und C++ geht das sehr einfach, ob du mit Delphi da weit kommst, weiß ich nicht. 
|
|
rud 
Hält's aus hier
Beiträge: 5
WinXP,OpenSuSe10
D7P,PHP,Java
|
Verfasst: Mo 12.01.09 20:29
hmm... C++
und vor allem visual studio ... das is mir alles zu komplex. mal schaun ob ich was in delphi finde
edit: sieht leider nicht so aus als ob das so einfach wäre
naja dann muss ich den wmp leider auslassen
|
|
|