Autor Beitrag
theLodibach
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.11.11 18:07 
Hallo, meine Frage bezieht sich auf die Tastenerkennung bei einer Windows Form.

Mein Programm soll per Pfeiltastendruck Controls auf der Form verschieben.
Das habe ich mit dem KeyDown Event auch schon geschafft. Jedoch kann man beim KeyDown Event mehrere Tasten gleichzeitig drücken. Dies verhindert die weiterführung meines Programms. Ich will erreichen, dass nur das Drücken von einer Pfeiltaste möglich ist. Bzw verhindern das mein Programm auf andere Tasten reagiert, solange eine Taste gedrückt ist.

Danke im Vorraus

Lodibach
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 18.11.11 18:47 
Hallo und :welcome:,

das liegt an der generellen Windows-Messageverarbeitung (dort wird anderen Tasten eine höhere Priorität als den Pfeiltasten zugeordnet). Dies kannst du mit jedem beliebigen Programm testen (z.B. Notepad, Word etc.).

Eine Alternative wäre die Verwendung der WinAPI-Funktion GetAsyncKeyState.
Diese Funktion habe ich z.B. bei meinem kleinen Spiel FastDriver schlussendlich auch eingesetzt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Utilities
{
  static class WinAPI
  {
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(Keys vKey); 

    static public bool IsKeyDown(Keys key)
    {
      return (GetAsyncKeyState(key) & 0x8000) != 0;
    }
  }
}

Die Methode IsKeyDown müßtest du dann allerdings in einem Timer aufrufen.
theLodibach Threadstarter
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1



BeitragVerfasst: So 20.11.11 14:51 
Danke für die Hilfe.
Kostet das viele Resourcen, wenn dauernd ein Timer im Hintergrund läuft?

EDIT:
Ich habs ausprobiert. Diese Möglichkeit verhindert den oben genannten Effekt leider auch nicht.

Gibt es noch andere Wege?
theLodibach Threadstarter
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 1



BeitragVerfasst: So 20.11.11 19:19 
Okay, ich hab das Problem gelöst.
Hab einfach mit nem boolean gearbeitet und den false gesetzt wenn eine Taste geedrückt wurde.

Trotzdem danke ;)