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

BOOL WINAPI ConsoleCtrlHandler(DWORD ctrlType) {
    if (ctrlType == CTRL_C_EVENT) {
        printf("\n^C erkannt (CTRL_C_EVENT)\n");
        return TRUE;  // TRUE = handled, nicht an Defaulthandler weiterleiten
    }
    return FALSE;
}

int main() {
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD mode = 0;

    // VT100 aktivieren
    if (!GetConsoleMode(hOut, &mode)) {
        fprintf(stderr, "Fehler: GetConsoleMode fehlgeschlagen\n");
        return 1;
    }
    mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hOut, mode);

	SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);

    printf("\x1b[2J\x1b[H");
    printf("\x1b[1;31mHallo in ROT\x1b[0m\n");
    printf("\x1b[1;32mHallo in GRUEN\x1b[0m\n");
    printf("\x1b[1;34mHallo in BLAU\x1b[0m\n");
    printf("\x1b[1;36mESC-Sequenz-Tester (Taste mit ESC-Sequenz druecken, ESC zum Beenden)\x1b[0m\n\n");

    while (1) {
        int c1 = _getch();

        if (c1 == 27) { // ESC
            if (_kbhit()) {
                int c2 = _getch();
                if (c2 == '[') {
                    int c3 = _getch();
                    printf("ESC-[%c  → Cursor-Taste erkannt: ", c3);
                    switch (c3) {
                        case 'A': printf("Pfeil oben\n"); break;
						case 'B': printf("Pfeil unten\n"); break;
						case 'C': printf("Pfeil rechts\n"); break;
						case 'D': printf("Pfeil links\n"); break;
                        default: printf("Unbekannt [%c]\n", c3);
                    }
                } else {
                    printf("ESC-%c (unbekannt)\n", c2);
                }
            } else {
                printf("ESC alleine gedrueckt → Programmende\n");
                break;
            }
        } else if (c1 == 3) { // Ctrl+C
            printf("^C gedrueckt → abort");
            break;
        } else if (c1 >= 32 && c1 <= 126) {
            printf("Taste: '%c' (%d)\n", c1, c1);
        } else {
            printf("Taste: (Code %d)\n", c1);
        }
    }

    return 0;
}