Einzelnen Beitrag anzeigen

idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#38

Re: Explizites tasten event auslösen

  Alt 22. Mai 2010, 13:14
Hallo, ich habe mich jetzt etwas intensiver mit Deinem Problem beschäftigt, und habe - glaube ich - die Ursache ziemlich zuverlässig identifiziert. Es ist so, wie ich schon in einem früheren Posting vermutet hatte: Die "echten" Tastaturereignisse (wenn Du eine Taste gedrückt hältst, werden mit sehr hoher Frequenz immer wieder Keydown Ereignisse erzeugt) fädeln sich zwischen die von Dir künstlich erzeugten Tastenereignisse ein und neutralisieren dadurch Deine Keyups, noch bevor die Ziffern, die Du schickst, eintreffen.

Ich habe probeweise die Funktion SendInput an Stelle von Postmessage versucht, um eine Folge von Tastenereignissen zu schicken, zwischen die sich nichts zwängen kann, damit funktioniert es einwandfrei. Leider lässt sich damit Dein Problem nicht lösen, weil sendInput kein Fensterhandle als Parameter kennt und nur an das Fenster mit aktivem Focus schicken kann.

Ich fürchte, dass deshalb die einzige - sehr aufwändige - Möglichkeit für Dich wäre, einen globalen Keyboardhook zu implementieren, der alle Tastaturereignisse abfängt, und sie nur weiterreicht, wenn Du gerade nicht beim Befüllen Deines Editfelds bist. Wenn Du gerade Dein Editfeld befüllst, muss der Hook die echten Tastaturereignisse abfangen und zwischenspeichern, und darf sie erst dann erneut in die Messagequeue stellen, wenn Dein Programm mit dem Befüllen des Editfelds fertig bist. Ich habe mich letztens mit der Programmierung eines sehr einfachen keyboard Hooks beschäftgit, der sich um die ShiftLock Taste kümmert. Das Programm funktioniert im grossen und Ganzen halbwegs, und wenn Du Dich drübertrauen willst, kann ich es Dir als Vorlage zukommen lassen (Alle Tutrials und Beispielprogramme, die Du zum Thema Keyboardhook findest, reagieren nur auf Tastaturereignisse, ohne sie zu beeinflussen, aber dabei entstehen erst die Schwierigkeiten).

Ein anderer Lösungsansatz fällt mir gerade ein: Nur sehr wenige Leute halten die Shift-Tasten ständig gedrückt. Wenn du einfach darauf wartest, dass der Tastenstatus oben ist, bevor Du Deine Komponente anfüllst, umgehst Du das Problem auf einfache Weise.
Wenn während des Anfüllen des Feldes die Umschalttasten gedrückt werden, einfach Feldinhalt löschen und wieder von vorne anfangen, wenn der Umschaltstatus passt. Die Lüftersteuerung ist ja nicht so etwas dringendes, wenn das Editfeld ein paar Sekunden später gefüllt wird, sollte es auch egal sein. Den ShiftLock bzw. ScrollLock Status, je nachdem welche Zifferntasten Du verwendest, solltest Du natürlich abfragen und wenn nötig kurzzeitig umschalten, weil das kann länger dauern, bis der Status sich ändert.
  Mit Zitat antworten Zitat