Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Einheitliche MediaPlayer Steuerung (https://www.delphipraxis.net/107309-einheitliche-mediaplayer-steuerung.html)

gibb 25. Jan 2008 15:22


Einheitliche MediaPlayer Steuerung
 
hallo miteinander,

Ich weiss das es zu dieser frage im netzt und auch in Delphi praxis x themen dazu gibt das ich das weiss liegt daran das ich schon etliche gelesen habe. Und genau dass bringt mich zu dieser frage.

Gibt es eine EINHEITLICHE möglichkeit Winamp, PowerDVD, VLC Player, Itunes, WMP und Co zu steuern ?

Winamp und PowerDVD hab ich nun implementiert mit Post message und dem entsprechenden Buchstaben den ich drücken will.
Delphi-Quellcode:
      postmessage(ProgHandle,WM_KEYDOWN,KeyInt,0);
      postmessage(ProgHandle,WM_KEYUP,KeyInt,0);
Nun scheint der VLC player das Partout nicht akzeptieren zu wollen. Ich habe dann nachgeforscht und fand dabei ansätze das mit sendmessage zu machen.

Beim WMPlayer genau dasselbe, dazu gibt es beispiele wie man solle doch mit WM_APPCOMMAND arbeiten.

Ich bin dabei eine Fehrnsteuerung zu schreiben über bluetooth. Und hier geht es um die Serverapplikation vom PC.

Ich dachte wenn ich das ganze so löse kann ich formatierte strings wie W1%00%88%Play an den server senden. Ich nehme dann den String auseinander. Teil eins (W1) wäre dann der zu verwendende handle/Applikation, Teil 2 (00)(Umsetzungsbeispiel unten) währe dann ob ctrl, alt oder sonstige tastenkombinationen gedrückt werden. und Teil drei währe der Typ des Kommandos um zu erkennen was man gerade ausgeführt hat.

Soweit so gut das funktioniert auch alles solange ich mich auf PowerDVD und
Delphi-Quellcode:
      PostMessage(ProgHandle, WM_KEYDOWN, VK_CONTROL,0); // Ctrl runter
      PostMessage(ProgHandle, WM_KEYDOWN, KeyInt, 0); //  Taste runter
      PostMessage(ProgHandle, WM_KEYUP, KeyInt, 0); // Taste rauf
      PostMessage(ProgHandle, WM_KEYUP, VK_CONTROL, 0); // Ctrl rauf
--------------------------------------------------------------------------------
das ganze gebe dann eine Ausführ Prozedur in etwa dieser form (Ist nur zur veranschaulichung und muss nicht unbedingt gelesen werden):

Delphi-Quellcode:
Procedure TForm1.SendCommandToProg(SpecialKey : String ; Key : String ;
CommandType : String ; ProgHandle : THandle);
Var
  KeyInt,SpecialKeyInt : Integer;
  DefaultBool, ShowCommandFailure : Boolean;
begin
  DefaultBool := False;
  ShowCommandFailure := GP_ConfigObject.GetValue('ShowProgFailure',DefaultBool);
  KeyInt := StrToInt(Key);
  SpecialKeyInt := StrToInt(SpecialKey);


  if GP_ConfigObject.GetValue('CommandDebugMode',DefaultBool) = True then
  begin
      MemoCommand.Lines.Add('Tastenbefehl konnte nicht gesendet werden!');
      MemoCommand.Lines.Add('Programm: '+FCurrentProgrammName);
      MemoCommand.Lines.Add(' Kommando Typ: '+CommandType);
      MemoCommand.Lines.Add(' SpecialKey: '+SpecialKey);
      MemoCommand.Lines.Add(' Key: '+Key);
      MemoCommand.Lines.Add(' Programm Handel: '+inttostr(ProgHandle));
  end;
  //-----------------------------------------------------------------


  if SpecialKeyInt = 00 then
  begin
    if ShowCommandFailure = True then
    begin
      postmessage(ProgHandle,WM_KEYDOWN,KeyInt,0);
      IF postmessage(ProgHandle,WM_KEYUP,KeyInt,0) = False then
      begin
        MemoCommand.Lines.Add('Tastenbefehl konnte nicht gesendet werden!');
        MemoCommand.Lines.Add(' '+FCurrentProgrammName);
        MemoCommand.Lines.Add(' '+CommandType);
        MemoCommand.Lines.Add(' SpecialKey: '+SpecialKey);
        MemoCommand.Lines.Add(' Key: '+Key);
        MemoCommand.Lines.Add(' Programm Handel: '+inttostr(ProgHandle));
        ModLogger.AddToLog('Konnte Kommando nicht and Handle senden. Programm: '+FCurrentProgrammName+' Commandtype: '+CommandType+' SpecialKey: '+SpecialKey+' Key: '+Key+' Programm Handel: '+inttostr(ProgHandle),ModError);
      end;
    end else
    begin
      postmessage(ProgHandle,WM_KEYDOWN,KeyInt,0);
      postmessage(ProgHandle,WM_KEYUP,KeyInt,0);
      MemoCommand.Lines.Add( FCurrentProgrammName+' Kommando erhalten: '+CommandType);
    end;
  end;

  if SpecialKeyInt = 01 then
  begin
    if ShowCommandFailure = True then
    begin
      PostMessage(ProgHandle, WM_KEYDOWN, VK_CONTROL,0); // Ctrl runter
      PostMessage(ProgHandle, WM_KEYDOWN, KeyInt, 0); //  Taste runter
      PostMessage(ProgHandle, WM_KEYUP, KeyInt, 0); // Taste rauf

      IF PostMessage(ProgHandle, WM_KEYUP, VK_CONTROL, 0) = False then // Ctrl rauf
      begin
        MemoCommand.Lines.Add('Tastenbefehl konnte nicht gesendet werden!');
        MemoCommand.Lines.Add(' '+FCurrentProgrammName);
        MemoCommand.Lines.Add(' '+CommandType);
        MemoCommand.Lines.Add(' SpecialKey: '+SpecialKey);
        MemoCommand.Lines.Add(' Key: '+Key);
        MemoCommand.Lines.Add(' Programm Handel: '+inttostr(ProgHandle));
        ModLogger.AddToLog('Konnte Kommando nicht and Handle senden. Programm: '+FCurrentProgrammName+' Commandtype: '+CommandType+' SpecialKey: '+SpecialKey+' Key: '+Key+' Programm Handel: '+inttostr(ProgHandle),ModError);
      end;
    end else
    begin
      PostMessage(ProgHandle, WM_KEYDOWN, VK_CONTROL,0); // Ctrl runter
      PostMessage(ProgHandle, WM_KEYDOWN, KeyInt, 0); //  Taste runter
      PostMessage(ProgHandle, WM_KEYUP, KeyInt, 0); // Taste rauf
      PostMessage(ProgHandle, WM_KEYUP, VK_CONTROL, 0); // Ctrl rauf
      MemoCommand.Lines.Add( FCurrentProgrammName+' Kommando erhalten: '+CommandType);
    end;
  end;

  if SpecialKeyInt = 02 then
  begin
    if ShowCommandFailure = True then
    begin
      PostMessage(ProgHandle, WM_KEYDOWN, VK_MENU,0); // Alt runter
      PostMessage(ProgHandle, WM_KEYDOWN, KeyInt, 0); //  Taste runter
      PostMessage(ProgHandle, WM_KEYUP, KeyInt, 0); // Taste rauf
      IF PostMessage(ProgHandle, WM_KEYUP, VK_MENU, 0) = False then // Alt rauf
      begin
        MemoCommand.Lines.Add('Tastenbefehl konnte nicht gesendet werden!');
        MemoCommand.Lines.Add(' '+FCurrentProgrammName);
        MemoCommand.Lines.Add(' '+CommandType);
        MemoCommand.Lines.Add(' SpecialKey: '+SpecialKey);
        MemoCommand.Lines.Add(' Key: '+Key);
        MemoCommand.Lines.Add(' Programm Handel: '+inttostr(ProgHandle));
        ModLogger.AddToLog('Konnte Kommando nicht an Handle senden. Programm: '+FCurrentProgrammName+' Commandtype: '+CommandType+' SpecialKey: '+SpecialKey+' Key: '+Key+' Programm Handel: '+inttostr(ProgHandle),ModError);
      end;
    end else
    begin
      PostMessage(ProgHandle, WM_KEYDOWN, VK_MENU,0); // Alt runter
      PostMessage(ProgHandle, WM_KEYDOWN, KeyInt, 0); //  Taste runter
      PostMessage(ProgHandle, WM_KEYUP, KeyInt, 0); // Taste rauf
      PostMessage(ProgHandle, WM_KEYUP, VK_MENU, 0);// Alt rauf
      MemoCommand.Lines.Add( FCurrentProgrammName+' Kommando erhalten: '+CommandType);
    end;
  end;
end;
Bis heute war ich noch "Stolz" auf meine Applikation weil ich überzeugt war das um Serverseitig eine neue Applikation einzubinden ich lediglich noch den Richtigen Handle brauche also gesamthaft irgendwie 20 zeilen Code um die Kommandos durchzulassen und den Handle zu besorgen.

Und ev. mal eine andere Tastenkombination wie z.b. ctrl+alt+taste einbinden.

Nun wie es scheint habe ich mich gewalltig geteuscht. Es mag mit vielen Programmen Funktionieren. jedoch scheinen nicht alle applikationen wie die oben genannten die man über tastaturen keys steuern kann, auf das postmessage WM_KEYDOWN/KEYUP zu hören.

Nun nochmals zu meiner Frage gibt es tatsächlich KEINE einheitliche möglichkeit einen tastendruck am Computer 100% so zu machen als wäre er vom benutzer gedrückt geworden ? ich verstehe nicht warum gewisse applikationen/handles mühe damit haben diese grundlegenden kommandos entgegen zu nehmen.

Gibt es keine Möglichkeit zu schauen das immer das gewünschte programm fenster im Vordergrund ist und dann so die tastaturdrücke zu senden und Windows dann zu überlassen das es den tastendruck richtig ans Programm schickt ?

Über ideen und anregungen währe ich wahnsinnig erfreut ich bin momentan einwenig "deprimiert"

lg Sev

gibb 25. Jan 2008 16:09

Re: Einheitliche MediaPlayer Steuerung
 
auf die schnelle scheint niemand zu wissen obs die möglichkeit gibt :-/

Naja ich schaue dann später am abend nochma rein...

auf jedenfall :dp:

schönes wochenende :cheers:

gibb 26. Jan 2008 20:00

Re: Einheitliche MediaPlayer Steuerung
 
Hallo

hat wirklich niemand eine idee ?

lg Sev

bitsetter 26. Jan 2008 22:34

Re: Einheitliche MediaPlayer Steuerung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

kann ja sein, dass WM_KEYDOWN und WM_KEYUP nicht vom VCL Player ausgewertet wird.
Hast du schon mal versucht den VCL Player mit windows.SetForegroundWindow() nach vorne zu holen und mit windows.keybd_event() Tastendrücke zu simmulieren?
Kann jetzt aber nicht sagen, ob es mit deiner Fernsteuerung auch funktioniert.

Falls du den VCL Player dann doch per Postmessage steuern möchtest, habe ich mal von den MenuItems die IDs geholt siehe Bild. Damit machst du das gleiche, als wenn du mit der Maus im Hauptmenü rumklickst.

toms 26. Jan 2008 23:25

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von gibb
Gibt es eine EINHEITLICHE möglichkeit Winamp, PowerDVD, VLC Player, Itunes, WMP und Co zu steuern ?

Winamp und PowerDVD hab ich nun implementiert mit Post message und dem entsprechenden Buchstaben den ich drücken will.
Delphi-Quellcode:
      postmessage(ProgHandle,WM_KEYDOWN,KeyInt,0);
      postmessage(ProgHandle,WM_KEYUP,KeyInt,0);
Nun scheint der VLC player das Partout nicht akzeptieren zu wollen. Ich habe dann nachgeforscht und fand dabei ansätze das mit sendmessage zu machen.

Hallo Sev, leider gibt es keine einheitliche Methode, die verschiedenen Players zu steuern.
Denn jede Anwendung wurde verschieden programmiert.

Den VLC Player kann man ja per Space Taste abspielen resp Pause aktivieren.
Probiere mal folgenden Code:

Delphi-Quellcode:
var
  wnd: HWND;
  LpARAM: LongInt;
begin
  wnd := FindWindow('wxWindowClassNR','VLC media player');
  if wnd <> 0 then
  begin
    lParam := MakeLong(0, MapVirtualKey(VK_SPACE, 0));
    PostMessage(WND, WM_KEYDOWN, VK_SPACE, lParam);
    PostMessage(WND, WM_KEYUP, VK_SPACE, lParam or $C0000000);
  end;
end;

gibb 28. Jan 2008 08:19

Re: Einheitliche MediaPlayer Steuerung
 
Danke erst einmal für die antworten.

Ich muss wohl nochmal ausholen weil ich mich wohl undeutlich ausgedrückt habe:

Ich meinte mit einer einheitlichen Steuerung nicht das man überall dasselbe drücken kann und dann Passiert Play. Sondern ich sende von meiner Handy Apllikation einen string der wiefolgt Formatiert ist 'W1%00%32%Pause/Play'
Alle kommandos die ich sende sind mit 3 '%' Zeichen getrennt, der erste "parameter" W1 (W1 = winamp, P1 = Powerdvd, usw.) ist die Applikation die ich zu Steuern wünsche. 00 ob andere tasten gedrückt werden müssen (01 = ctrl , 01 = alt usw.). Dann bleibt der tastendruck 32 für Space.


Mit diesen Informationen müsste es doch möglich sein alle apllikationen zu steuern. Weil ich weiss welchen handle ich weiss was ich drücken muss. Nur ich kann jetzt noch solange versuchen VLC Player fernzusteuern mit meiner oben geschriebenen Methode bis ich grau werde. Dies scheint er nicht zu akzeptieren.

meine Frage ist nun Ob es keine Einheitliche möglichkeit gibt um mit diesen informationen (wenns sein muss kann ich auch noch mehr informationen an den String hängen) die Tastaturdrücke auf der applikation auszuführen.

Klar sind alle verschieden aufgebaut. aber wenn ich eine Taste auf meinem keyboard drücke passiert ja auch immer dasselbe und irgendwer kann dann damit umgehen.

Lg Sev

Tut mir leid wenn ich villeicht einfach zu blöd bin um zu begreifen was ihr mir sagen wollt ;)

bitsetter 28. Jan 2008 10:55

Re: Einheitliche MediaPlayer Steuerung
 
Hallo,

hast du es nun schon mal mit keybd_event versucht?
Delphi-Quellcode:
var
  C: Char;
  wnd: HWND;
begin
  C := 'O';
  wnd:= FindWindow('wxWindowClassNR', 'VLC media player');
  if Wnd > 0 then
  begin
    if SetForeGroundWindow(Wnd) then
    begin
      keybd_event(VK_CONTROL, 0, 0, 0);
      keybd_event(VkKeyScan(C), 0, 0, 0);
      keybd_event(VkKeyScan(C), 0, KEYEVENTF_KEYUP, 0);
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    end;
  end
  else
   MessageDlg('Fenster nicht gefunden', mtError, [mbOk], 0);
Damit kannst du schon eher einen richtigen Tastendruck simulieren.

gibb 28. Jan 2008 11:16

Re: Einheitliche MediaPlayer Steuerung
 
nein habe ich noch nicht versucht werde es im verlauf vom nachmittag testen und hoffen das es funktioniert....

Ehm dafür muss das fenster aktiv sein sehe ich das richtig ? weil das ist in meinem Beispiel noch nicht der fall....

danke jedenfalls für den input...

Lg Sev

bitsetter 28. Jan 2008 11:52

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von gibb
Ehm dafür muss das fenster aktiv sein sehe ich das richtig ? weil das ist in meinem Beispiel noch nicht der fall....

Ja sonst funktioniert es nicht, dafür steht ja das SetForegroundWindow(), wenn das nichts bringt, kann mann es noch mit ForceForegroundWindow() versuchen.

gibb 28. Jan 2008 12:25

Re: Einheitliche MediaPlayer Steuerung
 
Ich habe es getestet... es funktioniert so... jetzt stellt sich mir die frage wie ich das in der Applikation handhaben will. Ob ich mir beide wege offen behalten will oder ob ich umstellen will so das die applikation immer wieder die fenster in den Vordergrund rückt oder wie das das ganze genau ablaufen soll...

aber ich danke dir jedenfalls einmal ganz herzlich...
ehm wie sieht es aus mit BringWindowToTop ? das ist das was ich jetzt verwende, gibt es etwas was gegen diese verwendung spricht ?

Lg Sev

gibb 28. Jan 2008 14:50

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von bitsetter
Hallo,

kann ja sein, dass WM_KEYDOWN und WM_KEYUP nicht vom VCL Player ausgewertet wird.
Hast du schon mal versucht den VCL Player mit windows.SetForegroundWindow() nach vorne zu holen und mit windows.keybd_event() Tastendrücke zu simmulieren?
Kann jetzt aber nicht sagen, ob es mit deiner Fernsteuerung auch funktioniert.

Falls du den VCL Player dann doch per Postmessage steuern möchtest, habe ich mal von den MenuItems die IDs geholt siehe Bild. Damit machst du das gleiche, als wenn du mit der Maus im Hauptmenü rumklickst.

Entschuldige, ich habe erst vorhin gesehen das ich dich hier so grausam übergangen habe...

Könnte mir jemand einen gefallen machen ? ich habe hier nur win2k und zuhause kein D2007 und ich müsste wissen wie der korrekte klassen &Fenster Name des Windows Media Player heisst damit ich ihn in den vordergrund setzen kann...

danke falls jemand schnell die zeit hat und ansonsten schaff ich das auch irgendwie zuhause ;)
LG Severin

bitsetter 28. Jan 2008 15:17

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von gibb
Ob ich mir beide wege offen behalten will oder ob ich umstellen will so das die applikation immer wieder die fenster in den Vordergrund rückt oder wie das das ganze genau ablaufen soll...

Ich würde die Fenster nur nach vorne holen wenn es unbedingt notwendig ist, da es sonst nerven kann, wenn irgend ein Fenster sich in den Vordergrund drängt.

Zitat:

Zitat von gibb
Könnte mir jemand einen gefallen machen ? ich habe hier nur win2k und zuhause kein D2007 und ich müsste wissen wie der korrekte klassen &Fenster Name des Windows Media Player heisst damit ich ihn in den vordergrund setzen kann...

danke falls jemand schnell die zeit hat und ansonsten schaff ich das auch irgendwie zuhause ;)
LG Severin

Bei mir geht es so:
Delphi-Quellcode:
FindWindow('WMPlayerApp', 'Windows Media Player')

Hador 28. Jan 2008 15:32

Re: Einheitliche MediaPlayer Steuerung
 
Also, ich weiß ja nicht, wie du das Handle vom VLC ermittelst, aber bei mir funktioniert es so problemlos:
Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('VLC DirectX', 'VLC (hardware YUV overlay DirectX output)');

  if wnd <> 0 then
  begin
    PostMessage(WND, WM_KEYDOWN, VK_SPACE, 0);
    PostMessage(WND, WM_KEYUP, VK_SPACE, 0);
  end;
end;

gibb 28. Jan 2008 15:40

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von bitsetter
Zitat:

Zitat von gibb
Ob ich mir beide wege offen behalten will oder ob ich umstellen will so das die applikation immer wieder die fenster in den Vordergrund rückt oder wie das das ganze genau ablaufen soll...

Ich würde die Fenster nur nach vorne holen wenn es unbedingt notwendig ist, da es sonst nerven kann, wenn irgend ein Fenster sich in den Vordergrund drängt.

Ja das dachte ich mir auch... VLC wird ja meistens zum Video schauen benutzt daher ist das nicht weiter tragisch. Und der MediaPlayer will einfach nicht so wie ich will daher soll er nun in den vordergrund bis ich herausgefunden habe wie ich das anders machen kann.

Zitat:

Zitat von gibb
Könnte mir jemand einen gefallen machen ? ich habe hier nur win2k und zuhause kein D2007 und ich müsste wissen wie der korrekte klassen &Fenster Name des Windows Media Player heisst damit ich ihn in den vordergrund setzen kann...

danke falls jemand schnell die zeit hat und ansonsten schaff ich das auch irgendwie zuhause ;)
LG Severin

Bei mir geht es so:
Delphi-Quellcode:
FindWindow('WMPlayerApp', 'Windows Media Player')

mhmmm komisch... und mit dem handle kannst du auch SetForeGroundWindow ausführen ? weil bei mir hackt das dort immer. resp. ich kriege immer ein False zurück und dann auf wiedersehen und gute nacht nix ist dann mit tastenkeys senden.

(Ich habe einen externen tester ;) also wird bei ihm nix gesendet wobei er mir genau denselben handle angeben hat...)

gibb 28. Jan 2008 15:41

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von Hador
Also, ich weiß ja nicht, wie du das Handle vom VLC ermittelst, aber bei mir funktioniert es so problemlos:
Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('VLC DirectX', 'VLC (hardware YUV overlay DirectX output)');

  if wnd <> 0 then
  begin
    PostMessage(WND, WM_KEYDOWN, VK_SPACE, 0);
    PostMessage(WND, WM_KEYUP, VK_SPACE, 0);
  end;
end;

ich mach das so:
FCurrentHandle := FindWindow('wxWindowClassNR','VLC media player');

und das Funktioniert auch ;) VLC ist nun komplett implementiert und da brauch ich nix mehr... ich haue jetzt nur noch auf dem WMP rum bis der auch einigermassen das macht was ich will ;)

gibb 29. Jan 2008 08:33

Re: Einheitliche MediaPlayer Steuerung
 
Weiss jemand ob es möglich ist mit windows.keybd_event() f1 tasten zu drücken ?

weil es ist nämlich so das ich das gefühl habe das kann nicht funktionieren... jedenfalls nicht so wie ich das mache...

Delphi-Quellcode:
     
 keybd_event(112,0,0,0);
 keybd_event(112,0,KEYEVENTF_KEYUP,0);
oder ist das richtig so ?

lg Severin

bitsetter 29. Jan 2008 09:05

Re: Einheitliche MediaPlayer Steuerung
 
Hallo,

in Delphi öffnet sich damit bei mir die Hilfe.
Delphi-Quellcode:
  keybd_event(VK_F1,0,0,0);
  keybd_event(VK_F1,0,KEYEVENTF_KEYUP,0);
Edit: scheint aber das gleiche zu sein.

gibb 29. Jan 2008 09:13

Re: Einheitliche MediaPlayer Steuerung
 
wollte gerade sagen 112 = VK_F1 ;)

Mhmmm komisch komisch komisch.... ich kriege das mit dem MediaPlayer einfach nicht zum laufen... der erhält die Kommandos nicht... wobei er immer in den vordergrund gerückt wird. und somit auch die events ausgelöst werden. Hat jemand eine idee woran das liegen könnte ? Ich verstehe langsam die welt nicht mehr...

Lg Severin

gibb 29. Jan 2008 09:33

Re: Einheitliche MediaPlayer Steuerung
 
kann mir jemand volgenden code mit dem windows media player testen =? bei mir will das einfach nicht funktionieren...

Delphi-Quellcode:
 
  FCurrentHandle := FindWindow('WMPlayerApp', 'Windows Media Player');

  if SetForeGroundWindow(FCurrentHandle) then
  begin
    keybd_event(112,0,0,0);
    keybd_event(112,0,KEYEVENTF_KEYUP,0);
  end;
passiert da was bei euch ? sollte die hilfe öffnen...

LG Severin...

bitsetter 29. Jan 2008 10:12

Re: Einheitliche MediaPlayer Steuerung
 
Bei mir erscheint die Hilfe vom Mediaplayer, habe allerdings noch Version 8 drauf. :oops:
Wird denn
Delphi-Quellcode:
  keybd_event(112,0,0,0);
  keybd_event(112,0,KEYEVENTF_KEYUP,0);
überhaupt ausgeführt. Vielleicht wäre es auch besser , wenn du dem Fenster noch einen kurzen Augenblick Zeit geben würdest nach vorne zu kommen.
Zitat:

Zitat von gibb
wollte gerade sagen 112 = VK_F1 ;)

Man sollte trotzdem die vorgegebenen Konstanten benutzen, auch wenn es jetzt so geht, da sich der Wert später eventuell auch mal ändern kann.

gibb 29. Jan 2008 10:17

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Zitat von bitsetter
Bei mir erscheint die Hilfe vom Mediaplayer, habe allerdings noch Version 8 drauf. :oops:
Wird denn
Delphi-Quellcode:
    keybd_event(112,0,0,0);
    keybd_event(112,0,KEYEVENTF_KEYUP,0);
überhaupt ausgeführt. Vielleicht wäre es auch besser , wenn du dem Fenster noch einen kurzen Augenblick Zeit geben würdest nach vorne zu kommen.

wird eigentlich ausgeführt ja... ich kanns jetzt nicht im debugger testen (weil ich wie bereits gesagt hier ein 2000 habe und noch die alte chrutze von mediaplayer wie im 98 ;) ) aber es erscheint zumindest text im memo feld nachdem der befehl ausgeführt wurde...

Zitat:

Zitat von gibb
wollte gerade sagen 112 = VK_F1 ;)

Man sollte trotzdem die vorgegebenen Konstanten benutzen, auch wenn es so geht.

Naja was ist der vorteil ? es ist leserlicher das ist mir klar. Mir bringts halt den vorteil das ich vond er Handy applikation über bluetooth einfach eine Zahl senden kann und nicht noch schauen muss das delphi einen string nun als konstante erkennt und wenn es mal keine konstante gibt (weiss nicht ob es für jede taste ne konstante gibt oder nur für die Aussergewöndlichen) ich noch etwas riesieges drumherum basteln muss. So ist es rein für mich Programiertechnisch sauberer gelöst als wenn ich versuche die konstante zu verwenden.

lg Sev

EDIT: ist jut ich lass euch in ruhe... ich wurde gerade eines besseres belehrt.. WMP 9 leuft doch auf win 2k auch wenn der 8 ter den ich habe irgendwie nicht laufen will... ^^'
ka wieso

toms 29. Jan 2008 14:17

Re: Einheitliche MediaPlayer Steuerung
 
Zitat:

Delphi-Quellcode:
var
  wnd: HWND;
  LpARAM: LongInt;
begin
  wnd := FindWindow('wxWindowClassNR','VLC media player');
  if wnd <> 0 then
  begin
    lParam := MakeLong(0, MapVirtualKey(VK_SPACE, 0));
    PostMessage(WND, WM_KEYDOWN, VK_SPACE, lParam);
    PostMessage(WND, WM_KEYUP, VK_SPACE, lParam or $C0000000);
  end;
end;

Funktioniert denn dieser Code nicht? Bei mir hat er funktioniert.

gibb 29. Jan 2008 14:39

Re: Einheitliche MediaPlayer Steuerung
 
doch der passt auch. nur muss ich ehrlich gesagt zugeben das ich nicht wusste wie ich das in meine Procedur umschreiben sollte..

Ich habe vorallem keine Ahnung was der Lparam genau macht (auch nach dem lesen der Delphi hilfe nicht...)

Ich weiss nur das es einen WParam gibt und einen LParam der WParam wäre in deinem Fall der VK_SPACE, der LParam ist mir ein rätsel. Vorallem scheint sich dieser Ständig zu ändern... und das möchte ich vermeiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz