> 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
> 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 |
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.
> 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.
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?
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.
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.
> 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.
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
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.
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...
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.