Forum: PC-Programmierung KEYPRESS.COM


von Fauler Sagg (Gast)


Angehängte Dateien:

Lesenswert?

> d:\>keypress
> This version of C:\KEYPRESS.COM is not compatible with the version of
> Windows you're running. Check your computer's system information and then
> contact the software publisher.

Tja, hat mal einner Lust daraus ein 64 bit PE machen?
Vorzugsweise in (Flat-)Assembler.
Ich würd ja, hab aber keine Ahnung von 64 bit und so.

Sind ja nur 21 Byte...

Ein paar BIOS-Calls und eine DOS-Funktion sehe ich im Hexdump.

: Verschoben durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und was soll das tolle DOS-Programm machen?

von Fauler Sagg (Gast)


Lesenswert?

> Und was soll das tolle DOS-Programm machen?

Du bist ja noch fauler als ich.

Jedenfalls hat es jahrtausendelang gut funktioniert.

1
; File Name   :  KEYPRESS.COM
2
; Format      :  MS-DOS COM-file
3
; Base Address:  1000h Range: 10100h-10115h Loaded length: 15h
4
5
.686p
6
.mmx
7
.model tiny
8
9
10
; Segment type:  Pure code
11
seg000 segment byte public 'CODE' use16
12
assume cs:seg000
13
org 100h
14
assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
15
16
17
; Attributes: noreturn
18
19
public start
20
start proc near
21
mov  ah, 1
22
int  16h    ; KEYBOARD - CHECK BUFFER, DO NOT CLEAR
23
      ; Return: ZF clear if character  in buffer
24
      ; AH = scan code, AL = character
25
      ; ZF set if no character in buffer
26
jnz  short loc_1010A
27
xor  al, al
28
jp  short loc_10110
29
30
loc_1010A:
31
mov  ah, 0
32
int  16h    ; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
33
      ; Return: AH = scan code, AL = character
34
mov  al, ah
35
36
loc_10110:
37
mov  ah, 4Ch
38
int  21h    ; DOS -  2+ - QUIT WITH EXIT CODE (EXIT)
39
start endp    ; AL = exit code
40
41
retn
42
seg000 ends
43
44
45
end start

von Jim M. (turboj)


Lesenswert?

Wozu braucht man sowas unter Windows?

CMD.exe kennt das "pause" Kommando von Haus aus.

Eine 64-Bit Windows PE Anwendung sähe deutlich anders aus, denn dort 
würden entsprechende Windows Funktionen aufgerufen. Int 21h gab es nur 
unter 16-Bit DOS.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Danke an Jim, damit hat sich das Thema offensichtlich erledigt.

von Fauler Sagg (Gast)


Lesenswert?

> offensichtlich erledigt.

"pause" taugt als Ersatz micht.

Es geht um das Erkennen und Unterscheiden eines Tastendrucks im
laufenden Script.

"pause" kann das ja offensichtlich nicht.

Insoweit hat sich auch nichts erledigt.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Fauler Sagg schrieb:
> Es geht um das Erkennen und Unterscheiden eines Tastendrucks im
> laufenden Script.

Was für ein Script denn? Ein .bat Script? Warum muss denn der 
KEYPRESS.COM-Ersatz in Assembler sein, kann deine Batch keine 
C-Programme aufrufen?

von Drückeberger (Gast)


Lesenswert?

Fauler Sagg schrieb:
> Es geht um das Erkennen und Unterscheiden eines Tastendrucks im
> laufenden Script.

Dann nimm halt CHOICE.EXE, gehört auch unter aktuellem Windows noch zum 
Lieferumfang.

von Peter D. (peda)


Lesenswert?

Fauler Sagg schrieb:
> Es geht um das Erkennen und Unterscheiden eines Tastendrucks im
> laufenden Script.

Tipp mal choice /? ein, damit kannst Du einzelne Tastendrücke auswerten.

von Fauler Sagg (Gast)


Lesenswert?

> kann deine Batch keine C-Programme aufrufen?

Ja, können schon.
In einer unbekannten Umgebung kann das aber auch in einer fehlenden
Runtimeumgebung enden.

"choice" ist auch nur suboptimal, weil nur isalnums abgefragt
werden können.

"keypress" gibt einen Teil des Scancodes zurück.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Fauler Sagg schrieb:
> In einer unbekannten Umgebung kann das aber auch in einer fehlenden
> Runtimeumgebung enden.

Dann kompiliert man sein C-Programm halt statisch, oder verzichtet auf 
C-Runtime-Funktionen. Sollte sich ja mit dem Win32-API machen lassen.

Assembler zu benutzen weil C nicht laufen könnte ist... spannend. Ein 
AMD64-Windows ist schon eine ziemlich gut definierte Umgebung. Das 
könnte man sogar in C# machen, .net ist ja vorinstalliert... Apropos, 
vielleicht geht das ja sogar in Powershell mit den entsprechenden 
.net-APIs - ganz ohne zusätzliche .exe .

Fauler Sagg schrieb:
> "keypress" gibt einen Teil des Scancodes zurück.
Die Frage ist natürlich, ob man für ein cmd.exe-Fenster überhaupt 
Scancodes abfragen kann!

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Niklas G. schrieb:
> Die Frage ist natürlich, ob man für ein cmd.exe-Fenster überhaupt
> Scancodes abfragen kann!

Eine Konsolanwendung kann das, nur ist das eine Lösung eines Problemes, 
das nicht existieren würde, wenn ... die Anforderungen nicht 
scheibchenweise genannt werden würden.

Vielleicht kann man das ganze uralte ausgeklügelte Batchgeraffel, das 
der Threadstarter weiterverwenden will, auch einfach wegwerfen und 
stattdessen eine der sich in den vergangenen 30 Jahren möglich 
gewordenen anderen Lösungen verwenden ... aber dann müsste der 
Threadstarter sich halt bewegen und erklären, welches Problem er 
eigentlich lösen will.

Scancodes in Batchdateien sind ganz sicher nicht das eigentliche 
Problem.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Rufus Τ. F. schrieb:
> Scancodes in Batchdateien sind ganz sicher nicht das eigentliche
> Problem.

Hab ich auch vermutet. Wahrscheinlich eine interaktive Anwendung als 
Batchprogramm, die sofort auf Tastendrücke reagieren muss. So etwas kann 
man z.B. mit C# als GUI-Anwendung fix besser neu bauen. Im Zweifelsfall 
ruft man (als Übergangslösung) die gewünschten Aktionen als 
Batch-Scripte auf...

von Peter D. (peda)


Lesenswert?

Fauler Sagg schrieb:
> "choice" ist auch nur suboptimal, weil nur isalnums abgefragt
> werden können.

Ja so ist das halt, wenn man nicht damit rausrückt, was das ganze 
überhaupt soll.
In der Regel kommt man mit PAUSE, SET /P oder CHOICE recht weit.

von Marten Morten (Gast)


Lesenswert?

Reden wir von diesem 
https://books.google.de/books?id=LRBokcwLB70C&pg=PA474 32 Jahre alten 
Programm?

Da starte ich ja noch lieber Windows Powershell ISE in Windows 10 als 
das. Tutorium gibt es bei 
https://docs.microsoft.com/de-de/powershell/scripting/components/ise/introducing-the-windows-powershell-ise?view=powershell-6

von DPA (Gast)


Lesenswert?

Hier, ein Posix shellscript dafür:
1
#!/bin/sh
2
3
stty cbreak -echo # Disable tty line buffering & echo
4
input=$(dd bs=1 count=1 2>/dev/null)
5
stty -cbreak echo # enable tty line buffering & echo
6
7
i=0
8
while [ $# != 0 ] && [ "$1" != "$input" ]
9
do
10
  i=$(expr $i + 1)
11
  shift
12
done
13
14
if [ $# = 0 ]
15
  then exit 0
16
fi
17
18
exit $(expr $i + 1)

Speichere das unter C:\wsl\keypress.sh oder so. Aktiviere nun die WSL. 
Erstelle nun einen neuen Link über "Rechte Maustaste->Neu->Verknüpfung". 
Beim ersten Eingabefeld "bash" eingeben (oder wsl, sollte auch gehen), 
beim Zweiten auf der nächsten seite "keypress" eingeben. Dan rechte 
Maustaste auf den Link, Eigenschaften, und bei Ziel " 
/mnt/c/wsl/keypress.sh" hinzufügen, danach sollte da 
"C:\Windows\System32\bash.exe /mnt/c/wsl/keypress.sh" stehen. Nun den 
Link in den Path verschieben, (z.B. nach C:\Windows). Jetzt kannst du 
das Script verwenden, einfach eine CMD öffnen, und "keypress.lnk a b c" 
eingeben.

von Markus (Gast)


Lesenswert?

Sicher, daß Du eine Konsolenanwendung benötigst? Das ganze klingt eher 
nach einem Fall für AutoHotKey.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.