C # și tastele cu săgeți

Sunt nou la C# și fac o lucrare într-o aplicație existentă. Am un vizualizator DirectX care are componente pe care vreau să le pot poziționa folosind tastele săgeată.

În prezent, eu sunt overriding ProcessCmdKey și de captură săgeată de intrare și a trimite un eveniment OnKeyPress. Acest lucru funcționează, dar vreau să pot utiliza modificatori ( ALT + CTRL + SHIFT ). De îndată ce țin un modificator și apăs o săgeată nu se declanșează niciun eveniment pe care îl ascult.

Are cineva idei sau sugestii cu privire la locul unde ar trebui să merg cu asta?

0
fr hi bn

2 răspunsuri

Am anunțat răspunsul Tokabi , dar pentru compararea cheilor există câteva sfaturi suplimentare despre < a href = "https://stackoverflow.com/questions/1369312/c-keys-enumeration-confused-keys-alt-or-keys-rbutton-keys-shiftkey-keys-alt/2033796#2033796"> StackOverflow.com aici . Iată câteva funcții pe care le-am folosit pentru a simplifica totul.

   public Keys UnmodifiedKey(Keys key)
    {
        return key & Keys.KeyCode;
    }

    public bool KeyPressed(Keys key, Keys test)
    {
        return UnmodifiedKey(key) == test;
    }

    public bool ModifierKeyPressed(Keys key, Keys test)
    {
        return (key & test) == test;
    }

    public bool ControlPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Control);
    }

    public bool AltPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Alt);
    }

    public bool ShiftPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Shift);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData))
        {
            int n = code.Text.IndexOfPrev('<', code.SelectionStart);
            if (n < 0) return false;
            if (ShiftPressed(keyData))
            {
                code.ExpandSelectionLeftTo(n);
            }
            else
            {
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData))
        {
            if (ShiftPressed(keyData))
            {
                int n = code.Text.IndexOf('>', code.SelectionEnd() + 1);
                if (n < 0) return false;
                code.ExpandSelectionRightTo(n + 1);
            }
            else
            {
                int n = code.Text.IndexOf('<', code.SelectionStart + 1);
                if (n < 0) return false;
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
0
adăugat

În cadrul procesului de procesare suprascris, cum determinați ce tastă a fost apăsată?

Valoarea keyData (al doilea parametru) se va schimba în funcție de tasta apăsată și de orice tastă modificator, de exemplu, apăsând săgeata stânga va reveni codul 37, schimbarea stânga va reveni 65573, ctrl-stânga 131109 și alt-stânga 262181.

Puteți extrage modificatorii și tasta apăsată de ANDing cu valorile enum corespunzătoare:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shiftPressed = (keyData & Keys.Shift) != 0;
    Keys unmodifiedKey = (keyData & Keys.KeyCode);

    // rest of code goes here
}
0
adăugat