Laden...

Mehrere Tasten lesen [Konsole]

Erstellt von B3nj vor 14 Jahren Letzter Beitrag vor 14 Jahren 984 Views
B3nj Themenstarter:in
242 Beiträge seit 2006
vor 14 Jahren
Mehrere Tasten lesen [Konsole]

Hallo,

ich habe gerade probiert ein kleines spiel (so à la space invaders) für die konsole zu machen, mal um zu schauen ob und wies geht.

jetzt bin ich aber über ein problem gestolpert. ich habe eine kleine "engine" geschrieben um die ganze ausgabe ein bisschen zu abstrahieren, diese engine beinhaltet auch die eingabe, in diesem fall der tastendruck des users.

viele tasten gibt es nicht: rechts, links, space (feuern).
intern wird für die eingabe der tasten ein eigener Thread erstellt und gestartet, dieser ist +/- so aufgebaut (ich habe den code nicht hier):

while (true)
{
    ConsoleKey key = Console.ReadKey().Key;
    if (KeyPressed != null)
    {
         KeyPressed(this, new ConsoleKeyPressedEventArgs(key));
    }
}

Leider kann ich nicht parallel tasten lesen, bzw. nachschauen ob eine spezielle taste gedrückt ist oder nicht.

ich möchte machen, dass man gleichzeitig laufen und ballern kann, dadurch, dass ich aber nur eine taste auf einmal erkennen kann geht das natürlich nicht, entweder läuft man oder man ballert.

also:
ist es möglich irgendwelche events (keydown/keyup) aus der konsole abzufangen? oder kann ich irgendwo eine Liste aller gerade geklickten Tasten abrufen?

und kann man das ohne die WinApi machen? weil, wenn ich c# code dann probiere ich zumindest immer so plattformunabhängig wie möglich zu bleiben:-) falls es aber nur mit der WinApi geht, dann ists auch nicht so schlimm.

mfG
benj

F
100 Beiträge seit 2009
vor 14 Jahren

mit

Console.ReadKey().Modifiers

kannst du abfragen ob Ctrl, Alt oder Shift gedrückt ist.

Müsstest halt das Ballern auf eine dieser Tasten legen.

Ansonsten würde dir GetAsyncKeyState weiterhelfen.

B3nj Themenstarter:in
242 Beiträge seit 2006
vor 14 Jahren

danke für die schnelle antwort!

also, das mit ctrl/shift habe ich auch schon probiert (habe vergessen es zu erwähnen).

Das funktioniert ganz gut wenn man zuerst auf die "ballern-taste" (ctrl) klickt und dann auf eine andere, dann wird beides wahrgenommen.

klicke ich jedoch zuerst auf eine andere taste und bleibe auch auf ihr (z.B. wenn ich ganz nacht rechts springen will) und möchte zwischendurch ballern, dann ist der aufruf der ersten taste (in diesem fall der rechte pfeil) verloren. somit funktioniert das nur, wenn ctrl zuerst geklickt wird, was ja nicht immer der fall sein muss.

die funktion "GetAsyncKeyState" werde ich mit gleich mal anschauen, vielen dank.

mfG
benj

-edit

ok, die funktion funktioniert perfekt:

         [DllImport("user32.dll")]
        static extern bool GetAsyncKeyState(ConsoleKey key); 

Wobei sie global funktioniert und nicht nur auf den eigenen Prozess beschränkt ist, was aber nicht so schlimm ist.

vielen dank.

mfG
benj