Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C# Spacabar + jiná klávesa

Zdar potřeboval bych poradit. Mám kód a potřebuju aby když zmáčknu D+Space tak aby to něco udělalo... Také pokud za Space dám například Alt tak to funguje ...

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space && e.KeyCode == Keys.D)
{
DoSkokAsync();
}
}
Předmět Autor Datum
Bohužel ve WinForms lze použít jen kombinaci CTRL, ALT či SHIFT + cokoliv A to následujícím způsobe…
Flash_Gordon 05.03.2017 17:33
Flash_Gordon
Ve WinForms si bude muset udržovat vlastní seznam stisknutých kláves. V KeyDown do něj přidávat, v K…
Wikan 05.03.2017 17:36
Wikan
Jestli myslíš něco takového, tak to mu spolehlivě fungovat taky nebude: int alpha = 0; int beta =…
Flash_Gordon 05.03.2017 17:49
Flash_Gordon
public partial class Form1 : Form { HashSet<Keys> pressedKeys = new HashSet<Keys>(); public Form1()…
Wikan 05.03.2017 18:02
Wikan
Zkus nezapisovat hodnotu do label1.Textu, ale hod tam něco takového: void HandleChange() { if (pre…
Flash_Gordon 05.03.2017 18:09
Flash_Gordon
Tak si tam přidá něco takového: void Form1_Deactivate(object sender, EventArgs e) { pressedKeys.Cle…
Wikan 05.03.2017 18:15
Wikan
Tak jo, taks mě přechytračil. Kurňa funguje to. :-) Ale je to docela pracné v některých případech,…
Flash_Gordon 05.03.2017 18:27
Flash_Gordon
Tak tohle je jenom PoC, určitě by to šlo udělat elegantněji. Např. přesunutím logiky a seznamu kláve… poslední
Wikan 05.03.2017 18:35
Wikan

Bohužel ve WinForms lze použít jen kombinaci CTRL, ALT či SHIFT + cokoliv

A to následujícím způsobem:

 if (e.KeyCode == Keys.D && (e.Alt || e.Control || e.Shift))
            {
                MessageBox.Show("You pressed shortcut");
            }

Ve WPF lze použít cokoliv:

if (Keyboard.IsKeyDown(Key.D) && Keyboard.IsKeyDown(Key.Space))
MessageBox.Show("You pressed shortcut");

Jestli myslíš něco takového, tak to mu spolehlivě fungovat taky nebude:

         int alpha = 0;
         int   beta = 0;
        

        private void FormKeyDown(object sender, KeyEventArgs e)
        {
              if (e.KeyCode == Keys.Space)
            {
                alpha = 1;
            }
            if (e.KeyCode == Keys.D)
            {
                beta = 1;
            }
          

            if (alpha == 1 && beta == 1  )
            {
            MessageBox.Show("You pressed");
            }
        }

        private void FormKeyUP(object sender, KeyEventArgs e)
        {
            alpha = 0;
            beta = 0;
        }
public partial class Form1 : Form
{
    HashSet<Keys> pressedKeys = new HashSet<Keys>();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        pressedKeys.Add(e.KeyCode);
        HandleChange();
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        pressedKeys.Remove(e.KeyCode);
        HandleChange();
    }

    void HandleChange()
    {
        label1.Text = pressedKeys.Contains(Keys.Space) && pressedKeys.Contains(Keys.D)
            ? "Stisknuto"
            : string.Empty;
    }
}

Funguje mi to dle očekávání. Proč by to nemělo být spolehlivé?

Zpět do poradny Odpovědět na původní otázku Nahoru