Autor Beitrag
rud
Hält's aus hier
Beiträge: 5

WinXP,OpenSuSe10
D7P,PHP,Java
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 11.01.09 15:06 
Hallo und :welcome: in der Entwickler-Ecke!

Probier es mal so:
ausblenden 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.

_________________
We are, we were and will not be.
rud Threadstarter
Hält's aus hier
Beiträge: 5

WinXP,OpenSuSe10
D7P,PHP,Java
BeitragVerfasst: 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.

ausblenden 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
ausblenden Delphi-Quelltext
1:
writeln(wmp.currentMedia.name);					

gibt wieder einen fehler aus,obwohl gerade ein song gespielt wird :(

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :nixweiss:

Du erstellt da einfach nur ein WMP-Objekt in dem Clientfenster, aber du übernimmst nicht die Kontrolle über eine laufende Instanz.
rud Threadstarter
Hält's aus hier
Beiträge: 5

WinXP,OpenSuSe10
D7P,PHP,Java
BeitragVerfasst: 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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

WinXP,OpenSuSe10
D7P,PHP,Java
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

WinXP,OpenSuSe10
D7P,PHP,Java
BeitragVerfasst: 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