Nicht ganz einfach bei der Erstellung eines Tastaturmakrorecorders ist
folgendes Problem:
Tastaturstatusabfragen (Int16 Funktion 01 oder 11) k”nnen von Programmen
auf 2 Weisen verwendet werden:
1. Gew”hnliche Abfrage
Hierbei wird im Polling der Status abgefragt. Alternativ k”nnte 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 k”nnen,
wie z.B. Mausereignisse, Zeittakte und das Erfassen des Drckens von
CTRL, SHIFT oder ALT zum Umschalten auf die Menleiste.
Allerdings k”nnte 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 w„hrend einer Aktion
Das Programm PROFIB.EXE z.B. fragt w„hrend des Druckvorgangs st„ndig die
Tastatur ab, ob eine Taste gedrckt wurde, und leert den Tastaturpuffer
gegebenfalls. Bloá wie soll man den Unterschied zum Fall 1. feststellen???
Nach auáen ist dies absolut dasselbe Verhalten!
N„mlich 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}
L”sungen:
1. Der Interrupt 16/01 bzw. 16/11 meldet *stets* "Keine Taste", d.h.
die TP-Fkt. KeyPressed meldet st„ndig FALSE. L„át Programme mit dem
Programmstck (2) aufh„ngen, 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 n„chste Taste "zum Verkauf" feilbietet.
Dies funktioniert recht universell, es ist aber ein verteufelter
Kompromiá zu schlieáen:
- Die Zahl ist *so* hoch zu w„hlen, daá w„hrend eines Jobs keine Taste
(mehr) emuliert wird (korrekte Funktion der Routine (1)).
- Bei einer hohen Zahl dauert die Routine (2) sehr lange; oft viel l„nger
als bei normaler Tastatureingabe
Als L”sung hierfr k”nnte man die *echte* Tastatur abfragen und bei gedrckter
Taste einen Ausbruch aus dieser Schleife erzwingen (siehe L”sung 1)
3. Ausnutzen k”nnte man, daá bei Druckjobs sich auf dem Bildschirm etwas
„ndert, z.B. eine Zahl hochl„uft oder eine Balkengrafik sich ver„ndert.
Man k”nnte wiedergabeseitig (?) diese Ver„nderung benutzen, um den Z„hler
zurckzusetzen, der ansonsten analog zu L”sung 2 die Leseversuche z„hlen
muá.
4. Die Umschaltung der Anzahl k”nnte dynamisch w„hrend der Emulation geschehen.
Die Registrierung ist jedoch nicht w„hrend der Aufnahme m”glich, sodaá
der entsprechende Befehl nachtr„glich in die Steuerdatei eingefgt werden
muá.
Weitere Probleme und L”sungen:
- Die Tastenanschl„ge sind jedermann zug„nlich; Paáw”rter stehen praktisch
im Klartext im Tastenfile. (L”sung: Scrambeln, was sonst!!)
- Das Tastaturfile kann also in 3 Arten vorkommen:
+ als editierbare ASCII-Datei ("Text")
+ als Bin„rdatei mit Tastencodes ("File of Integer")
+ als gescrambelte Bin„rdatei (Dateiaufbau ist natrlich geheim!)
Umwandlungsm”glichkeit muá via MREC m”glich sein!
Detected encoding: UTF-8 | 0
|