Aplică chei de modificare în caractere

Care este cel mai bun mod de a aplica tastele de modificare a tastaturii unui personaj pentru a obține valoarea modificată (pentru cultura curentă)?

De exemplu, cu tasta schimbată (pentru o tastatură din Marea Britanie):

Assert.AreEqual('!', Modify('1'));
Assert.AreEqual('"', Modify('2'));
Assert.AreEqual('A', Modify('a'));
Assert.AreEqual('B', Modify('b'));
Assert.AreEqual(':', Modify(';'));
Assert.AreEqual('?', Modify('/'));

Am o modalitate de a spune dacă tastele modificatoare sunt apăsate, ceea ce nu am este o modalitate de a mapa apoi caracterul corect dat acest set de chei de modificare.

4
@JeffMercado și va fi și mai rău dacă utilizatorul folosește o configurație personalizată de tastatură personalizată!
adăugat autor Guillaume, sursa
@JeffMercado Am considerat că acest lucru este pentru o aplicație care ar putea fi folosită în multe regiuni, așa că nu este posibil să rezolv problema singură.
adăugat autor Martin, sursa
@Marino, am de fapt cheile care au fost apăsate (unde 1 și Numpad1 sunt chei diferite). Deci, așa cum spuneți pe bună dreptate, deși modificarea caracterelor este imposibilă, pot modifica în mod direct cheile enum, dacă este necesar.
adăugat autor Martin, sursa
Ți-am editat titlul. Consultați În cazul în care întrebările includ "etichete" în titlurile lor? ", în cazul în care consensul este" nu, ar trebui nu".
adăugat autor John Saunders, sursa
Acest lucru nu este ceva ce puteți obține de la o codificare sau o cultură. Aceste relații sunt (definite) numai în software-ul driver-ului tastaturii.
adăugat autor Henk Holterman, sursa
Aș spune un dicționar, dar acest lucru nu este foarte scalabil, mai ales dacă trebuie să sprijiniți mai multe machete de tastatură.
adăugat autor Jeff Mercado, sursa
Acest lucru nu este posibil deloc. Modificați ("1") trebuie și ar trebui să returneze o listă de rezultate (de exemplu, în engleză este "!" Și "End"). Și depinde foarte mult de localizarea tastaturii.
adăugat autor Marino Šimić, sursa
Apoi, din nou aveți modificări atât de ciudate ca în limba croată, puteți scrie litere germane: "AltGr +" tasta înainte de 1 'urmată de' u '"este un modifier al lui ü, unde cheia înainte 1 este o cheie mortală care funcționează doar ca modifer pentru apăsarea de taste succesive.
adăugat autor Marino Šimić, sursa

1 răspunsuri

În funcție de ceea ce încercați să realizați, s-ar putea face următoarele:

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern short VkKeyScan(char ch);

    [Test]
    public void Test_VkKeyScan()
    {
        Assert.AreEqual(VkKey('!'), VkKey('1'));
        Assert.AreEqual(VkKey('@'), VkKey('2'));
    }

    private short VkKey(char p)
    {
        return (short)(0xff & VkKeyScan(p));
    }

Construirea unui dicționar folosind metoda VkKey furnizată nu ar trebui să fie o problemă prea mare.

UPDATE: Manipularea corectă a mai multor planificări ar necesita utilizarea VkKeyScanEx în loc de VkKeyScan și furnizarea explicită a aspectului curent sau necesar ca parametru.

0
adăugat