#include <windows.h>
#include <stdio.h>

int main() {
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD oldInMode, oldOutMode;

    // Ursprüngliche Modi speichern
    GetConsoleMode(hIn, &oldInMode);
    GetConsoleMode(hOut, &oldOutMode);

    // Eingabemodus konfigurieren: Events statt gepufferte Zeilen
    DWORD inMode = oldInMode;
    inMode &= ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
    SetConsoleMode(hIn, inMode);

    // Ausgabe: VT100 aktivieren
    SetConsoleMode(hOut, oldOutMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);

    // Bildschirm leeren und Farben
    printf("\x1b[2J\x1b[H");
    printf("\x1b[1;36mKeyevent-Tester mit ReadConsoleInput()\x1b[0m\n\n");

    INPUT_RECORD input;
    DWORD read;
    while (1) {
        if (!ReadConsoleInput(hIn, &input, 1, &read)) break;

        if (input.EventType == KEY_EVENT && input.Event.KeyEvent.bKeyDown) {
            WORD vk = input.Event.KeyEvent.wVirtualKeyCode;
            CHAR ascii = input.Event.KeyEvent.uChar.AsciiChar;
            DWORD ctrlState = input.Event.KeyEvent.dwControlKeyState;

            if (ascii == 27) {
                printf("ESC erkannt → Programmende\n");
                break;
            } else if (ascii == 0x1A) {
                printf("Ctrl-Z erkannt (0x1A)\n");
            } else if (ascii >= 32 && ascii < 127) {
                printf("Taste: '%c' (0x%02X), VK: %d\n", ascii, ascii, vk);
            } else if (ascii) {
                printf("Steuerzeichen: 0x%02X (VK: %d)\n", ascii, vk);
            } else {
                printf("Sondertaste VK: %d (ScanCode: %d)\n",
                       vk, input.Event.KeyEvent.wVirtualScanCode);
            }
        }
    }

    // Modi zurücksetzen
    SetConsoleMode(hIn, oldInMode);
    SetConsoleMode(hOut, oldOutMode);

    return 0;
}