Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:24.1.2016 13:46

Ahoj všichni. Narazil jsem na menší problém se vstupem z klávesnice ve Windows Forms. Potřebuji zjistit, zdali je v danou chvíli (při překreslení pictureBoxu) stisknutá určitá klávesa. Zkoušel jsem použít události KeyDown a KeyUp a ukládat si, které klávesy jsou stisknuté. Bohužel při stisknutí (puštění) více kláves najednou se nespustí událost pro všechny. Neví někdo, jak získat vstup bez použití událostí? Google mi ukazuje jen hromadu návodů na ty události...

Odpovědět 24.1.2016 13:46
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Petr Čech (czubehead):24.1.2016 14:35

https://www.nuget.org/…ouseKeyHook/

byte[] DistinctVirtualKeys = Enumerable
    .Range(0, 256)
    .Select(KeyInterop.KeyFromVirtualKey)
    .Where(item => item != Key.None)
    .Distinct()
    .Select(item => (byte)KeyInterop.VirtualKeyFromKey(item))
    .ToArray();

public static IEnumerable<System.Windows.Forms.Keys> GetPressedKeys()
{
    var keyboardState = new byte[256];
    GetKeyboardState(keyboardState);

    foreach (var virtualKey in DistinctVirtualKeys)
    {
        if ((keyboardState[virtualKey] & 0x80) != 0)
        {
            yield return KeysFromKey(KeyInterop.KeyFromVirtualKey(virtualKey));
        }
    }
}

private static System.Windows.Forms.Keys KeysFromKey(Key key)
{
    return (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(key);
}
Nahoru Odpovědět  +1 24.1.2016 14:35
Why so serious? -Joker
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Petr Čech (czubehead)
Zdeněk Pavlátka:27.1.2016 19:30

KeyInterop je z WPF, takže ho použít nemůžu... 8|
A ten MouseKeyHook způsobuje stejný problém jako standartní události - při stisknutí více kláves najednou se nespustí událost pro všechny.

Nahoru Odpovědět 27.1.2016 19:30
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
ostrozan:28.1.2016 22:40

nějak mi uniká podstata problému - je prakticky nemožné stisknout dvě klávesy najednou - nějaké ty milisekundy rozdílu vždycky budou

vždycky to bude sekvence dvou, či více kódů kláves, které posílá klávesnice, byť třeba s malým odstupem, ale s tím by si snad měl vstup poradit a vyvolat událost pro každý z nich - pokud se třeba obsluhou první události nezabýváš tak dlouho, že to tu další nestihne

 
Nahoru Odpovědět 28.1.2016 22:40
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Marian Benčat:28.1.2016 22:52

Zkousel jste message filter? Odchytnete se na keydown x0100 a keyup 101 a ukladejte (jak to asi delate). pak se tedy muzete ptat "ktere jsou stale zmackle," kdykoliv budete chtit.

https://msdn.microsoft.com/….110%29.aspx?…

Nahoru Odpovědět 28.1.2016 22:52
"C# 3.0 (2007) volal Java 8 (2014), že chce svoje featury zpět"
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na ostrozan
Zdeněk Pavlátka:29.1.2016 5:16

Pochopil jsi to špatně, nejde o odchycení více kláves naráz, ale o to, že když stisknu více kláves najednou, zavolá se událost jen pro někteté, zbytku jako bych se ani nedotkl.
A to nemluvím o nějakých extrémních počtech, stává se to už u 3 kláves.

Nahoru Odpovědět 29.1.2016 5:16
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
ostrozan
Redaktor
Avatar
ostrozan:29.1.2016 17:36

Obávám se ,že tvůj problém nemá řešení - to co popisuješ je totiž záležitost samotné klávesnice, potažmo jejího ovladače.
Zkusil jsem si jak se chová handler události KeyDown a KeyUp ve WF a zjistil, že záleží na kombinaci stisklých kláves.
Např. můžeš stisknout najednou čtyři klávesy QWER, ale uz ne QWERT - klávesnice nepošle nic, nebo při stisku QWAS, což jsou taky jen čtyři klávesy, klávesnice nic nepošle - stejně tak současný stisk CVB, což jsou dokonce jen tři klávesy.
Povšimni si, že se jedná vždy o sousední klávesy - naopak stiskem a podržením třeba i pěti, šesti kláves rozházených různě po klávesnici klávesnice posílá opakovaně sekvenci kódů všech stisklých kláves v pořadí, jak byly naskenované.
I když tady musím dodat, že jak která - klávesnice na mojem NTB tu sekvenci pošle jen jednou a pak opakuje jen poslední stisknutou klávesu .

To vše se dá samozřejmě ověřit i v každém text. editoru - jen tam nejsou vidět speciální klávesy a uvolnění.

 
Nahoru Odpovědět 29.1.2016 17:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.