KEYPRESS.COM

Gast #5774943
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.
Angehängte Dateien:
Gast #5774961
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
Gast #5775260
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.
Gast #5775411
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.
Persönliche Seite #5775416
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!
Persönliche Seite #5775440
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.
Persönliche Seite #5775459
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...
Gast #5775735
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren