# Prozessorticks/Tastatur überwachen/ -> Wiederholbarkeit?



## Tiava (3. Aug 2006)

Servus,

ich bin ja mittlerweile ganz annehmbar in Java, in meiner Ferialpraxis darf ich zwar nichts programmieren, dafür aber diverse Spielchen Testen, was ganz witzig ist. Mir ist dabei die Idee zu einem Testprogramm gekommen, dass den Tester unterstützt. Dieses Programm soll können:

- Überwacht die Tastatur des Computers und protokolliert alle Tastenaktionen (drücken/loslassen) sowie die Mausbewegungen/klickereien, bleibt aber im Hintergrund. Sollte ein Fehler im getesteten Programm auftreten, drückt der Tester eine bestimmte Taste (zB F12) und das Programm tritt in den Vordergrund. Nun kann der Tester eine Fehlermeldung eingeben und das fehlerhafte Programm beenden. Eventuell wäre noch interessant einen automatischen Screenshot machen zu lassen oder so sobald man dann F12 drückt.

- Durch das Protokoll sollte man dann nachvollziehen können warum der Fehler passiert ist.

- Falls nicht, lassen sich per Knopfdruck die protokollierten Aktionen ab einem gesetzten Startpunkt wiederholen, wobei das Programm einfach die Zeiten vom Protokoll verwendet.

- Wenn nötig kann man auch einfach random-aktionen einführen bei dem das Programm sozusagen einen Chaos-Test zu überstehen hat 

Soweit die Idee dahinter.

Die Probleme dabei:

- Realzeit ist ja nicht gleich der Programmzeit. Sollte beim zweiten Test ein Programm mehr im Hintergrund laufen läuft das getestete Programm unter Umständen langsamer und der Fehlerfall tritt nicht wieder ein.

- Verschiedene PCs. Ein PC kann schneller als der andere sein, was wieder zu Zeitdifferenzen führt.

Leider ist es nicht möglich, in das zu testende Programm selbst eine Protokolldatei oder ähnliches einzuprogrammieren, die dann die Positionen beschreibt wo man etwas getan hat, weil das ein externes Programm ist. Sonst wärs ja fast zu einfach...

Meine Fragen an euch lauten im Prinzip:

- Ist es möglich das Problem mit der Zeit irgendwie zu umgehen, und wenn ja, wie?
- Gibt es noch mehr Probleme die ich nicht berücksichtigt habe?
- Ist so ein Programm aus eurer Sicht wirklich sinnvoll?

Danke schonmal im Vorraus

Tiava


----------



## Mario_H (3. Aug 2006)

Wie wär's wenn du die (tatsächiche) Laufzeit deines Programms auswertest (so nach dem Motto wie weit hat meine schleife gezählt bis: xyz), die des anderen müsste ja dann etwa analog sein.

Andererseits frag ich mich warum du der Zeit soo eine Bedeutung beimisst..


----------



## AnmeldeBoykottierer (3. Aug 2006)

Tiava hat gesagt.:
			
		

> - Ist es möglich das Problem mit der Zeit irgendwie zu umgehen, und wenn ja, wie?



Dein Programm kann gar nicht exakt festellen, wann was in dem zu Überwachenden Programm passiert. Ganz einfach unmöglich ist es, wenn du nur eine CPU hast. Dann bekommt dein Prozess immer nur eine Zeitscheibe, die es nutzen kann, wenn das BS denkt es wäre an der Zeit. Wann dein BS das macht, darauf hast du gar keinen Einfluss.



			
				Tiava hat gesagt.:
			
		

> - Gibt es noch mehr Probleme die ich nicht berücksichtigt habe?



Jede Menge. Ich glaube zwar grob zu verstehen was du mit den Zeiten meinst, aber genau das kannst du gar nicht erreichen. Nehmen wir ein typisches Problem, du hast zwei Threads laufen. Wann welcher von den beiden Rechenzeit bekommt, darauf hast du null einfluss (s. O.). Echt parallel kann auf einer CPU nichts laufen. Das OS schaltet nur so schnell zwischen Prozessen hin und her, dass man das nicht merkt. Ähnliches passiert bei Threads. Und dann ist die Sache, wie filterst du Tastureingabe und Mausereingnisse, wenn nicht das zu überwachende Programm den Eingabefokus hat? Z.B. lass ich gerne Musik im Hintergrund laufen... 



			
				Tiava hat gesagt.:
			
		

> - Ist so ein Programm aus eurer Sicht wirklich sinnvoll?



Sorry, aber meiner Meinung nach nicht. Es ist zwar eine nette Idee, aber wie du schon sagtest, man weiß nicht wo in dem Programm Fehler auftauchen. Es gibt verschiedene Mechanismen den Problemen gezielter zu begegnen. 
Das eine sind Unit-Tests. Diese können automatisiert die funktionalität in gewissen kritischen Bereichen testen. Solche Tests sichern vorallem die Funktionalität auch dann, wenn etwas verändert wird (neue Klasse die gleiches Interface implementiert). 
Dann gibt es noch logger. Hier kann man ganz gezielt Eingaben und aufrufe mit loggen. Man hat die Zuordnung Wann, Wo, Was gemacht wird.
Aufruf-Stacks, man sieht in welcher Methode es zu einem Fehler kommt
...

Gibt noch ein paar Hilfsmittel, die möglich sind. So etwas wie Unit-Tests gibt es auch voll automatisch für GUIs, die Dinger sind dann aber schon teuer. Jedenfalls denke ich ist der Ansatz nett, nur ist es nicht trivial möglich hieraus eine sinnvolle Implementierung zu erstellen. 
Zudem kann eine Tast (z.B. F12) auch in zu testenden Programm eine Funktion besitzen...

Gruß Der Gast der sich nicht im Forum anmelden möchte


----------



## Leroy42 (3. Aug 2006)

AnmeldeBoykottierer hat gesagt.:
			
		

> Gruß Der Gast der sich nicht im Forum anmelden möchte



Grundsätzlich nicht? Religiöse Gründe? Zu faul? Überredbar? Bestechbar? ...


----------



## Tiava (3. Aug 2006)

Danke für die raschen Antworten.

Ich hab halt gedacht ich weiß es zwar nicht wie man sowas machen könnte aber es mag ja sein dass es irgendwo ein paar geniale Leute gibt die das wissen. Fragen schadet ja nicht, denk ich mal.

Wenn ihr alle so sicher seid dass das nix werden kann dann lass ich den Gedanken mal lieber fallen. Immerhin wäre das ein nicht allzukleiner Aufwand sowas zu machen (zumindest für mich ^^)

Trotzdem Danke 

Gruß
Tiava


----------



## AnmeldeBoykottierer (3. Aug 2006)

Leroy42 hat gesagt.:
			
		

> Grundsätzlich nicht? Religiöse Gründe? Zu faul? Überredbar? Bestechbar? ...



Prinzipien (oder sowas), jedenfalls nicht in diesem Forum. Dazu fehlt es dem noch an viel viel viel zu viel.
Bewunderswert z.B. dass in fast jedem Thread (den ich bisher gelesen haben) solche völlig OT Themen auftauchen, ohne zu sagen dass es OT ist und ohne je wieder zu der eigentlichen Frage zurück zu kommen.
Also im Prinzip Überzeugbar, aber da müsste doch noch einiges passieren.

@Tiava: Wollte dich nicht entmutigen. Ist halt nur wirklich ein schweres Projekt und wenn man es fertig hat und es keiner verwendet, nicht wirklich toll!


----------



## Kola (3. Aug 2006)

Vielleicht kannst du da mit einem Robot-Object was machen: java.awt.Robot
Schau dir mal die API an.


----------



## Guest (7. Aug 2006)

Robo hilft mir zwar schon ganz schön, aber was erst mal noch wichtiger wär wäre wie man das Programm im Hintergrund laufen lassen kann und trotzdem die Key/Maus-Eingaben bekommt (also ohne Fokus). Irgendwie find ich da nirgends was dazu...


----------



## Anmeldeboykottierer (7. Aug 2006)

Wenn du die Tastendrücke einer fremden Anwendung mitbekommen möchtest, dann kommst du (imho) nicht um einen Hook rum. Diese sind aber sehr plattforspezifisch (unter Windows hättest du hier direkte API aufrufe). Ich denke da wirst du auch unter anderen Systemen es nicht viel leichter haben. Würde wohl eher auf eine native Methode hinauslaufen.


----------



## byte (7. Aug 2006)

AnmeldeBoykottierer hat gesagt.:
			
		

> Prinzipien (oder sowas), jedenfalls nicht in diesem Forum. Dazu fehlt es dem noch an viel viel viel zu viel.
> Bewunderswert z.B. dass in fast jedem Thread (den ich bisher gelesen haben) solche völlig OT Themen auftauchen, ohne zu sagen dass es OT ist und ohne je wieder zu der eigentlichen Frage zurück zu kommen.
> Also im Prinzip Überzeugbar, aber da müsste doch noch einiges passieren.



Mit anderen Worten: Das Forum ist Dir gut genug, um hier zu lesen und zu schreiben, aber zu schlecht, um sich hier anzumelden. Mit welch pilosophischen Fragen sich manche doch zu beschäftigen scheinen. :roll:


----------



## Tiava (7. Aug 2006)

Ich hab von nem Bekannten schonmal was drüber gehört dass es solche "Hooks" gibt aber wo gibts da gute Anleitungen/Erklärungen dazu?

Ich brauch das ganze eh nur für Windows also ist plattformspezifisch nicht so tragisch


----------



## Anmeldeboykottierer (7. Aug 2006)

Das könnte dir weiterhelfen:
http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=82

Was meine Prinizipien angeht, wenn sie dir nicht gefallen habe ich auch andere!


----------



## Guest (9. Aug 2006)

Hmm in Java gibts sowas wohl nicht, oder? Soll heißen dass die Virtual Machine alle Tasten abfängt und an das Programm schickt oder so...

Ich check das irgendwie ned, tut mir leid. Is ja Assembler, soweit ich das seh, aber wie hilft mir das für mein Java Programm? Laut Internet-recherche kann ich in Java kein Inline-Assembler machen also könnt ichs ned mal als Funktion einbinden.

Tut mir leid dass ich dumm bin  :cry:


----------



## moormaster (9. Aug 2006)

Anonymous hat gesagt.:
			
		

> Hmm in Java gibts sowas wohl nicht, oder? Soll heißen dass die Virtual Machine alle Tasten abfängt und an das Programm schickt oder so...



Viel mehr stellt die VM keinen direkten Weg zur Verfügung, diese Hooks im System zu registrieren. Das geht nur, indem man native Bibliotheken einsetzt, welche im Betriebssystem diese Hooks anmelden. Damit geht dir die Plattformunabhängigkeit deines Programms verloren, weil für jedes Betriebssystem die native Bibliothek extra compiliert werden muss. In diesem Fall reicht das bloße neu compilieren nicht mal, da das, was du vorhast, auf den einzelnen Systemen unterschiedlich realisiert werden muss.



> Ich check das irgendwie ned, tut mir leid. Is ja Assembler, soweit ich das seh, aber wie hilft mir das für mein Java Programm? Laut Internet-recherche kann ich in Java kein Inline-Assembler machen also könnt ichs ned mal als Funktion einbinden.



Selbst wenn Java Inline-Assembler verstünde, dann auch nur den, der zu der VM gehört und somit würde dieser den gleichen Beschränkungen unterliegen, wie der Java Code auch.


----------



## Anmeldeboykottierer (9. Aug 2006)

Tiava hat gesagt.:
			
		

> Ich brauch das ganze eh nur für Windows also ist plattformspezifisch nicht so tragisch





			
				Anonymous hat gesagt.:
			
		

> Ich check das irgendwie ned, tut mir leid. Is ja Assembler, soweit ich das seh...
> 
> Tut mir leid dass ich dumm bin



Ach, ist nicht entschuldbar!  :wink: Wichtig ist an dem Link nicht wirklich der Quellcode gewesen, du würdest deine Bibliothek nie direkt mit Assember erstellen. Für JNI bietet sich unter Windows schließlich eine DLL an, diese lässt du dir in Ruhe von einem C-Compiler (oder C++) erstellen. Dazu gibt es auch eine (automatisch erzeugte) Header-Datei, die auch die Aufrufkonvention enthält. Hier macht es z.B. einen sehr großen Unterschied ob du pascal, stdCall oder etwas anderes hast. 
Selbst wenn du dann Assembler verwenden möchtest, wäre es eher inline-Assembler (und der dann im C-Programm). 
Du kannst dir aber auch einfach das PSDK von Windows schnappen (liegt z.B. beim Borland C Compiler bei) und direkt die API Funktionen aufrufen (da steckt dann der gesehene Code hinter), dass ist das was zu ziemlich jeder machen würde :wink: 
Die Methoden sind dann eher so etwas wie SetWindowsHookEx mit den entsprechenden Parametern. Es gibt auch zum PSDK dann eine entsprechende Doku (die da weiterhilft). Ansonsten kannst du auch (wirklich komfortabel) bei Microsoft suchen, da hast du online die API mit Beispielen (zumindest teilweise mit Bsp).
Du kämst aber halt nich um JNI rum.


----------



## Guest (5. Jan 2007)

Tiava hat gesagt.:
			
		

> Danke für die raschen Antworten.
> 
> Ich hab halt gedacht ich weiß es zwar nicht wie man sowas machen könnte aber es mag ja sein dass es irgendwo ein paar geniale Leute gibt die das wissen. Fragen schadet ja nicht, denk ich mal.
> 
> ...



Jooo dann mal viel Glück 
Gruß Hack/L


----------

