Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
Delphi 2006 Architect
|
Einheitliche MediaPlayer Steuerung
25. Jan 2008, 15:22
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
|