PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastendrücke simulieren



BLUESCREEN3D
11-08-2003, 11:46
Weiss jemand, wie ich mit einem Programm (am liebsten C++) Tastendrücke für ein anderen Programm simulieren kann?
Ich kenne das von VB unter win - da konnte man Tastatureingaben an andere laufende Programme senden.

wraith
11-08-2003, 12:46
Mit C++ alleine wirste wohl kein Glück haben,sowas läuft über die API.
Wie in deinem VB Bsp,welches dafür die WinApi benutzt.

BLUESCREEN3D
11-08-2003, 14:34
Welche API muss ich dann denn benutzen? Von X, von Gnome, von Metacity?

BLUESCREEN3D
12-08-2003, 12:15
Oder gibt es eine "LinuxAPI"???

wraith
12-08-2003, 12:20
Ich habe mal gegoogelt,und das hier gefunden
http://www.eecs.umich.edu/~mckay/computer/xop0.3.tar.gz
Eine Xop Extension,die genau das erlauben soll.Hab' es mir nicht weiter angesehen.
Naja,wenn das mit X möglich ist,dann wird das auch mit allem anderen möglich sein,was auf X aufbaut.

anda_skoa
12-08-2003, 20:11
Original geschrieben von wraith

Naja,wenn das mit X möglich ist,dann wird das auch mit allem anderen möglich sein,was auf X aufbaut.

Das ist praktisch wie in Windows auch, dort muss man auch die API des Windowing Systems benutzen, wenn man dessen Events simulieren will.

ciao,
_

anda_skoa
12-08-2003, 20:13
Original geschrieben von BLUESCREEN3D
Oder gibt es eine "LinuxAPI"???

Ja, eigentlich schon.
Meistens kommt man zwar mit Standard APIs wie POSIX, etc., aus, aber manchmal, zb bei systemnahen Sachen wie Hardwareansteuerung, sind linuxspezifische Befehle nötig.

Ciao,
_

BLUESCREEN3D
12-08-2003, 21:58
Auf der Website steht "xop" unter "TCL/TK", was ich noch nie benutzt habe... funzt das mit C++ oder ist das eine eigene Sprache?

anda_skoa
12-08-2003, 23:27
Wahrscheinlich ist das nur ein Demoprogramm in Tcl/Tk.

Ich schätze es wird intern XSendEvent http://tronche.com/gui/x/xlib/event-handling/XSendEvent.html verwenden.

Du kannst diese API Funktion ja wahrscheinlich auch direkt benutzen.

Ciao,
_

BLUESCREEN3D
13-08-2003, 02:11
cool - thx :)
aber die funktion überfordert mich gerade etwas...
für "display" muss ich wohl "localhost:0.0" angeben - aber was sind "PointerWindow" und "InputFocus" und welches von beiden brauche ich? Und woher kriege ich das für ein bestimmtes Fenster (ich will den Tastendruck an eine Instanz vom mplayer senden -> http://www.linuxforen.de/forums/showthread.php?s=&postid=534428#post534428)?

anda_skoa
13-08-2003, 12:00
Original geschrieben von BLUESCREEN3D
cool - thx :)
aber die funktion überfordert mich gerade etwas...
für "display" muss ich wohl "localhost:0.0" angeben


Display ist eine Struct, die von verschiedenen X Funktionen als Parameter gebraucht wird.
Wenn du auf der XSendEvent Manual Seite auf Display klickst, kommst du zu der Beschreibung.
So wie ich das verstehe, erzeugst du es mit dieser XOpenDisplay Funktion.



- aber was sind "PointerWindow" und "InputFocus" und welches von beiden brauche ich? Und woher kriege ich das für ein bestimmtes Fenster (ich will den Tastendruck an eine Instanz vom mplayer senden


Der Window Parameter ist eine ID des Fenster, das das Event erhalten soll.
PointerWindow bzw InputFocus könnten Konstanten sein, die X selber auswertet.

Vielleicht kann man mplayer dazu bringen, seine Window ID rauszuschreiben, bzw wenn mplayer den Focus hat, könnte InputFocus funktionieren.

Ciao,
_

BLUESCREEN3D
13-08-2003, 23:45
Original geschrieben von anda_skoa
Vielleicht kann man mplayer dazu bringen, seine Window ID rauszuschreiben
wie bringe ich den mplayer dazu? die einzige möglichkeit, die mir einfiele, wäre in den quellcode eine kleine zeile einzufügen, die das macht...


Original geschrieben von anda_skoa
bzw wenn mplayer den Focus hat, könnte InputFocus funktionieren.
könnte gehen - ich starte das tastedruck-send-proggi, das proggi schläft eine sekunde, während der sekunde gebe ich dem mplayer den focus
das problem ist nur: der tastendruck muss in möglichst kurzer zeit an zwei instanzen vom mplayer gesendet werden...

anda_skoa
14-08-2003, 14:49
Hab mir deinen Thread in Linuxforen duchgelesen.
Wenn du einen Mplayer asu einem anderen Programm steuern willst, ist eher die -slave Commandline Option des mplayers interessant.

Ciao,
_

BLUESCREEN3D
15-08-2003, 02:45
Original geschrieben von anda_skoa
Hab mir deinen Thread in Linuxforen duchgelesen.
Wenn du einen Mplayer asu einem anderen Programm steuern willst, ist eher die -slave Commandline Option des mplayers interessant.
thx, bin garnicht auf die idee gekommen, dass es sowas gibt... :rolleyes:

folgendes funzt auch ohne probleme :)
echo -e "seek 100\npause" | mplayer -slave eine-datei.mpeg

aber wie schreibe ich von einem anderen programm aus in die stdin von einem laufenden mplayer?

BLUESCREEN3D
15-08-2003, 03:09
hat sich erledigt - das funzt wohl mit pipes...

habe folgendes probiert:

mkfifo input1
mkfifo input2
mplayer -slave -vo aa video.mpeg < input1 &
mplayer -slave video.mpeg < input2 &
echo "pause" > input1
echo "pause" > input2

an dieser stelle sind beide instanzen des mplayers am anfang des videos und pausiert

jetzt gibt es nur ein problem: alles weitere was ich in die input1 und input2 schreibe wird irgendwie ignoriert - eigentlich sollten beide instanzen mit folgendem befehl anfangen, abzuspielen:
echo "pause" > input1; echo "pause" > input2
aber da passiert nichts... :confused:

BLUESCREEN3D
15-08-2003, 03:18
Habe das Problem einfach mal umgangen, indem ich ein kleines C++-Proggie geschrieben habe - jetzt funzt es so:

mkfifo input1
mkfifo input2
mplayer -slave -vo aa video.mpeg < input1 &
mplayer -slave video.mpeg < input2 &

dann das c++-proggi:

#include <fstream>
#include <unistd.h>

using namespace std;

int main()
{
fstream datei1,datei2;

datei1.open("input1");
datei2.open("input2");

datei1 << "pause" << endl;
datei2 << "pause" << endl;

sleep(4);

datei1 << "pause" << endl;
datei2 << "pause" << endl;

datei1.close();
datei2.close();

return(0);
}

Dadurch wird nicht zweimal in die pipes geschrieben, sondern alles mit einem öffnen der dateien erledigt... warum es anders nicht geht, ist mir trotzdem noch unklar...

das ergebnis gefällt mir aber - obwohl ich bei keiner der beiden instanzen "-nosound" benutzt habe merkt man nur eine kleine differenz :cool:

edit: eine instanz ist doch schneller - ca. 0.1 bis 0.2 sekunden... besser geht es wohl nicht
wenn man 9 instanzen gleichezitig das video abspielen lässt, sieht man auch einen kleinen unterschied zwischen allen instanzen - aber der effekt ist goil :D