Entwickler-Ecke

Multimedia / Grafik - Gestarteten Windows Media Player kontrollieren


rud - So 11.01.09 14:54
Titel: Gestarteten Windows Media Player kontrollieren
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
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  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:
user defined image

ich hoffe ihr könnt mir weiterhelfen. mit itunes habe ich alles noch allein geschafft XD

mfg rud


Gausi - So 11.01.09 15:06

Hallo und :welcome: 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 
  { TODO -oUser -cConsole Main : Hier Code einfügen } 
  CoInitialize(nil); 
  h := FindWindow('WMPlayerApp''Windows Media Player'); 
  // wmp.CreateParented(h); 
  // vielleicht so?
  wmp := TWindowsMediaPlayer.CreateParented(h); 
  CoUnInitialize; 
end.


rud - So 11.01.09 15:21

ja so hat es funktioniert XD

komischer weise hatte ich das selber schon mal so :autsch: :gruebel:

trotzdem geht der zugriff so noch nicht reibungslos.


Delphi-Quelltext
1:
writeln(wmp.versioninfo); // = 11.0.5721.5230"                    

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:
http://www.delphipraxis.net/post781146.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 - 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 [http://docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/DE/html/delphivclwin32/Controls_TWinControl_CreateParented.html] was darauf hindeutet. :nixweiss:

Du erstellt da einfach nur ein WMP-Objekt in dem Clientfenster, aber du übernimmst nicht die Kontrolle über eine laufende Instanz.


rud - 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 (http://developer.apple.com/sdk/) was sich mit delphi leicht nutzen lässt:


Delphi-Quelltext
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
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  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 > 1then
        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 - 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 - 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 - Mo 12.01.09 15:45

Da hilft dir das Windows Media Player SDK:
http://msdn.microsoft.com/en-us/library/aa393415.aspx
Mit Visual Studio und C++ geht das sehr einfach, ob du mit Delphi da weit kommst, weiß ich nicht. ;-)


rud - 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