Quelltext /~heha/hs/dos/mrec_src.zip/MREC.TXT

Nicht ganz einfach bei der Erstellung eines Tastaturmakrorecorders ist
folgendes Problem:
Tastaturstatusabfragen (Int16 Funktion 01 oder 11) knnen von Programmen
auf 2 Weisen verwendet werden:
1. Gewhnliche Abfrage
 Hierbei wird im Polling der Status abgefragt. Alternativ knnte auch direkt
 (mit Warten auf Taste) das BIOS gefragt werden (ReadKey). Damit schneidet
 sich der Programmierer allerdings den Weg ab, bspw. in einer objektorien-
 tierten Benutzerschnittstelle auch auf weitere Ereignisse reagieren zu knnen,
 wie z.B. Mausereignisse, Zeittakte und das Erfassen des Drckens von
 CTRL, SHIFT oder ALT zum Umschalten auf die Menleiste.
 Allerdings knnte es auch Programme geben, die fr Tasteneingaben ausschlie-
 lich die Funktion 16/00 bzw. 16/10 verwenden. Hierfr werde ich im Programm
 MREC einen Schalter vorsehen.

2. Abfrage whrend einer Aktion
 Das Programm PROFIB.EXE z.B. fragt whrend des Druckvorgangs stndig die
 Tastatur ab, ob eine Taste gedrckt wurde, und leert den Tastaturpuffer
 gegebenfalls. Blo wie soll man den Unterschied zum Fall 1. feststellen???
 Nach auen ist dies absolut dasselbe Verhalten!
 Nmlich in Turbo Pascal:
 {$X+}                               				(1)
 for i:=1 to irgendwohin do begin
  TuIrgendwas;
  If KeyPressed then If ReadKey=0 then ReadKey;
  {Tastaturpuffer stets leeren!}
 end;

 Das Tastaturabfrageprogramm macht "dagegen":

 {$X+}								(2)
 repeat until keypressed;
 C1:=ReadKey;			{ASCII-Code}
 if C1=0 then C2:=ReadKey;	{Scan-Code erweiterte Tastatur}

Lsungen:
1. Der Interrupt 16/01 bzw. 16/11 meldet *stets* "Keine Taste", d.h.
 die TP-Fkt. KeyPressed meldet stndig FALSE. Lt Programme mit dem
 Programmstck (2) aufhngen, leider.
 Um beim Test nicht RESET drcken zu mssen, ist eine normale
 Tastaturabfrage zum Ausbruch aus der Schleife erforderlich

2. Der Interrupt 16/01 bzw. 16/11 meldet eine gewisse (ausreichend hohe)
 Anzahl an "Keine Taste", bis er die nchste Taste "zum Verkauf" feilbietet.
 Dies funktioniert recht universell, es ist aber ein verteufelter
 Kompromi zu schlieen:
 - Die Zahl ist *so* hoch zu whlen, da whrend eines Jobs keine Taste
 (mehr) emuliert wird (korrekte Funktion der Routine (1)).
 - Bei einer hohen Zahl dauert die Routine (2) sehr lange; oft viel lnger
 als bei normaler Tastatureingabe
 Als Lsung hierfr knnte man die *echte* Tastatur abfragen und bei gedrckter
 Taste einen Ausbruch aus dieser Schleife erzwingen (siehe Lsung 1)

3. Ausnutzen knnte man, da bei Druckjobs sich auf dem Bildschirm etwas
 ndert, z.B. eine Zahl hochluft oder eine Balkengrafik sich verndert.
 Man knnte wiedergabeseitig (?) diese Vernderung benutzen, um den Zhler
 zurckzusetzen, der ansonsten analog zu Lsung 2 die Leseversuche zhlen
 mu.

4. Die Umschaltung der Anzahl knnte dynamisch whrend der Emulation geschehen.
 Die Registrierung ist jedoch nicht whrend der Aufnahme mglich, soda
 der entsprechende Befehl nachtrglich in die Steuerdatei eingefgt werden
 mu.

Weitere Probleme und Lsungen:

- Die Tastenanschlge sind jedermann zugnlich; Pawrter stehen praktisch
 im Klartext im Tastenfile. (Lsung: Scrambeln, was sonst!!)
- Das Tastaturfile kann also in 3 Arten vorkommen:
 + als editierbare ASCII-Datei ("Text")
 + als Binrdatei mit Tastencodes ("File of Integer")
 + als gescrambelte Binrdatei (Dateiaufbau ist natrlich geheim!)

 Umwandlungsmglichkeit mu via MREC mglich sein!
Vorgefundene Kodierung: UTF-80