Tastendruck an TProcess?

Antworten
Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Tastendruck an TProcess?

Beitrag von Teekeks »

Hallo!
Ich habe eine (vermutlich) recht einfache frage:
Wie kann ich einen Tastendruck an ein TProcess senden??

Gruß Teekeks

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Tastendruck an TProcess?

Beitrag von Hitman »

"Prozesse" kriegen keine Tastenanschläge .... du kannst Daten an STDIN schicken und Tastenanschläge an Fenster. Was genau willst du denn machen? Und unter welchem Betriebssystem und Widgetset?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

Ich will an ein TProcess auf dem mplayer läuft diverse Tasten Senden um diesen (mplayer) zu navigieren.
Ich will eigentlich nur Sound ausgeben.
Ich habe SUSE 11.0 und Lazarus 0.9.26b.


pluto
Lazarusforum e. V.
Beiträge: 7180
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Tastendruck an TProcess?

Beitrag von pluto »

Du könntest auch meine XINE Unit nutzen. Wenn dein Programm nur unter Linux laufen soll, und wenn du die Dev Packte von xine installiert hast:
viewtopic.php?t=2431&p=27704#p27704
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Tastendruck an TProcess?

Beitrag von monta »

Über Process.Input sollte das gehen, so macht es Cactus auch, siehe die wichtigen beiden Zeilen dazu aus der mplayer-Anbindung:

Code: Alles auswählen

MPlayerProcess: TProcess;
//...
 
procedure SendCommand(cmd: string);
begin
   cmd:=cmd+#10; //MPLayer always needs #10 as Lineending, no matter if win32 or linux
  //wenn Process läuft:
  MPlayerProcess.Input.write(cmd[1], length(cmd));
end;
Johannes

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

Hi!
Danke für eure reichliche Beteiligung...
Ich habe jetzt die varriante von monta genommen.

Gruß Teekeks

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Tastendruck an TProcess?

Beitrag von _X_ »

Es hat schon jemand eine MPlayer-Unit gebastelt: http://cactus.hey-you-freaks.de/index.php
Die Unit habe ich auch noch mal im Anhang.

mfg _X_

Edit:// Aus der hat monta glaube ich, auch seinen Code-Schnipsel :wink:
Edit2:// Hat er gesagt, hab ich überlesen.
Dateianhänge
mplayer.pas
Die Cactus-Jukebox mplayer Unit
(12.89 KiB) 96-mal heruntergeladen

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

@_X_: Ich werd mir das mal anschauen...
@all:
Könnt ihr mir bei folgendem Problem helfen?

Code: Alles auswählen

procedure TFrmMain.BtnPlayClick(Sender: TObject);
begin
  if not is_Paused then
  begin
    ap.Active:=false;
//  ap.Options:=ap.Options+[poUsePipes];
    ap.CommandLine:='mplayer "4LYN - Kisses Of A Strobelight.mp3"';
    ap.Active:=true;
  end else
  begin
    is_Paused:=false;
    SendCommand('p');
  end;
end;
 
procedure TFrmMain.BtnPauseClick(Sender: TObject);
begin
  if ap.Active then
  if (not is_Paused) then
    begin
      SendCommand('p');
      is_Paused:=true;
    end else
    begin
      SendCommand('p');
      is_Paused:=false;
    end;
end;
 
procedure TFrmMain.BtnStopClick(Sender: TObject);
begin
  if ap.Active then
    SendCommand('q');
//  ap.Active:=false;
end;
 
procedure TFrmMain.FormCreate(Sender: TObject);
begin
  ap:=TProcess.Create(self);
  ap.Options:=ap.Options+[poUsePipes];
end;
 
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
  ap.Free;
end;
 
procedure TFrmMain.SendCommand(cmd: string);
begin
  cmd:='p'+#13; // wenn hier #10 steht passiert das gleiche...
  ap.Input.Write(cmd[1],Length(cmd));
end;

Wenn ich jetzt auf Play, dann auf Pause und dann wieder auf Play drücke (oder zwischen den zwei Plays auf Stop) kriege ich einen External: SIGPIPE error...
Ich weis aber noch nicht warum...
Wisst ihr warum?

Gruß Teekeks
ps.: Tolles Forum!!!!!einseinself

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

Ich habe den Fehler gefunden:
es fehlte ein "-slave" bei den Optionen (und es muss natürlich #10 heißen...)

Gruß Teekeks

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

Siehe Edit unten!

Und nocheinmal habe ich eine Frage:
Cactus hat bei sich folgendes stehen:

Code: Alles auswählen

SendCommand('get_time_length');

Also bei mir wird da sonstawie dolle Rumgemeckert, auch wenn ich alles genauso habe wie er (von den Parametern usw her...).
Was mache ich hier falsch?

Code: Alles auswählen

function TFrmMain.Get_TrackLength: longint;
var tmps: string;
    i:integer;
    time: real;
begin
  repeat begin
    SendCommand('get_time_length'); // hier kriege ich eine External SIGSEGV... Ich weis aber nicht warum...
    sleep(5);
    tmps:=GetProcessOutput;
   end;
   until pos('LENGTH', tmps)>0;
   i:=LastDelimiter('=', tmps);
   if i > 0 then begin
      time:= StrToFloat(Copy(tmps, i+1, Length(tmps)));
      time:=time*1000;
      result:=round(time);
   end;
end;


Wäre schön wenn ihr mir helfen könntet...

Gruß Teekeks

Edit:

Argggg! gefunden. Der Process solte laufen befor man Kommandos sendet ^^
Aber was sagt mir die Zahl 205000 bei einem 3:25 langen Titel???

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Tastendruck an TProcess?

Beitrag von Hitman »

Teekeks hat geschrieben:Argggg! gefunden. Der Process solte laufen befor man Kommandos sendet ^^
Aber was sagt mir die Zahl 205000 bei einem 3:25 langen Titel???


Hmm ... wie wärs mit (60 * 3 + 25) * 1000 ? ;)
Oder anders gesagt: Millisekunden.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Tastendruck an TProcess?

Beitrag von Teekeks »

ähhh. Stimmt! Das war zu einfach, darauf bin ich nicht gekommen.
DANKE!

Antworten