![]() |
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:
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.
postmessage(ProgHandle,WM_KEYDOWN,KeyInt,0);
postmessage(ProgHandle,WM_KEYUP,KeyInt,0); 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:
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.
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; 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 |
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: |
Re: Einheitliche MediaPlayer Steuerung
Hallo
hat wirklich niemand eine idee ? lg Sev |
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. |
Re: Einheitliche MediaPlayer Steuerung
Zitat:
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; |
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 ;) |
Re: Einheitliche MediaPlayer Steuerung
Hallo,
hast du es nun schon mal mit keybd_event versucht?
Delphi-Quellcode:
Damit kannst du schon eher einen richtigen Tastendruck simulieren.
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); |
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 |
Re: Einheitliche MediaPlayer Steuerung
Zitat:
|
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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