[C#] Num-, Caps- etc. Lock Status feststellen, ohne API Methode GetKeyState??



  • Servus,

    ich frage mich gerade wie es möglich ist fest zu stellen, ob Num-Lock etc. eingerastet ist. In C++ geht man gemütlich daher und nimmt GetKeyState. Natürlich kann ich die Methode importieren, darf ich aber leider nicht *g*.

    Hat denn jemand eine Idee wie man das anders realisieren könnte? Bei google habe ich mir bereits den Wolf gesucht.....

    mfg
    Hellsgore



  • Hellsgore schrieb:

    Servus,
    ...
    In C++ geht man gemütlich daher und nimmt GetKeyState. Natürlich kann ich die Methode importieren, darf ich aber leider nicht *g*.
    ...
    Hellsgore

    Geht afaik wohl nur ueber die API:

    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true, CallingConvention=CallingConvention.Winapi)] 
    public static extern short GetKeyState(int keyCode); 
    
    public void KeyStatus()
    {
    bool isCapsLock = ((ushort) GetKeyState(0x14 /*VK_CAPSLOCK*/) & 0xffff) != 0;
    bool isNumLock = ((ushort) GetKeyState(0x90 /*VK_NUMLOCK*/) & 0xffff) != 0;
    bool isInsert = ((ushort) GetKeyState(0x2D /*VK_INSERT*/) & 0xffff) != 0;
    }
    

    Wieso darfst du nicht importieren??



  • Servus,

    ajo danke, die Methode kannte ich schon *g*. Keine Ahnung warum aber ich bin:

    1. Nicht in der Lage, Regeln zu schaffen
    2. Nicht in der Lage, daran was zu ändern....

    von daher, bleibt das Feature offen *g*...

    thx
    Hellsgore



  • Sehr schön, danke! Können wir das bitte in die FAQ tun?



  • private void keyPress(object sender, KeyEventArgs args) {
        // ...
    
        switch(e.KeyCode) {
            case Keys.CapsLock:
                // ...
                break;
            case Keys.Insert:
                // ...
                break;
            case Keys.NumLock:
                // ...
                break;
            deault:
                break;
        }
    
        // ...
    }
    

    Control.KeyPress Event
    Keys Enumeration

    grüße



  • Sorry, folgende Anpassung im Code:

    // ...
            switch(args.KeyCode) {
            // ...
    

    grüße



  • @Bernhard`
    Deine Variante ist nur da, um abzufangen ob NumLock gedrückt wurde. Sie fängt aber nicht ab, ob NumLock eingerastet ist.



  • Noodles schrieb:

    @Bernhard`
    Deine Variante ist nur da, um abzufangen ob NumLock gedrückt wurde. Sie fängt aber nicht ab, ob NumLock eingerastet ist.

    Stimmt, ich habe wohl zu schlampig gelesen.
    Control.KeyDown wär wohl das passendere Event.

    grüße



  • Bernhard` schrieb:

    Noodles schrieb:

    @Bernhard`
    Deine Variante ist nur da, um abzufangen ob NumLock gedrückt wurde. Sie fängt aber nicht ab, ob NumLock eingerastet ist.

    Stimmt, ich habe wohl zu schlampig gelesen.
    Control.KeyDown wär wohl das passendere Event.

    grüße

    Nein, ein Event nutzt dir in diesem Fall garnichts, da der Status(!) der Taste(n) vom System bzw. an das System abgefragt werden muss.
    Wie Noodles schon schreibt, kannst du mit einem Event immer nur auf eine Aktion abfragen, erkennst aber (zumindest in diesem Fall) nicht die Auswirkung der Aktion.

    Eine evtl. andere Moeglichkeit (keine Ahnung, ob das funzt...) waere es z.B. die Tase '7' im Numblock per Code zu aktivieren. Ist das eingehende (ASCII ??) Zeichen eine 7, dann ist Num an aktiv, ist es keine 7, ist er inaktiv...



  • abbess schrieb:

    Nein, ein Event nutzt dir in diesem Fall garnichts, da der Status(!) der Taste(n) vom System bzw. an das System abgefragt werden muss.

    Aber bevor man auf die Idee kommt, dass man sich die gedrückte Taste eben selbst merkt, simuliert man lieber im Programm einen Tastendruck ..

    private bool isNumPressed;
    
    private void keyDown(object sender, KeyEventArgs args) {
        if(args.KeyCode == Keys.NumLock) {
            isNumPressed = true;
        }
    }
    
    private void keyUp(object sender, KeyEventArgs args) {
        if(args.KeyCode == Keys.NumLock) {
            isNumPressed = false;
        }
    }
    

    Aber mal ganz abgesehen davon, dass meine Version sehr wohl funktioniert, deine nicht. Es ist nämlich vollkommen
    egal, welche Steuerungstasten, etc.. man gedrückt hat. Zum Beispiel bekomm ich beim Pressend der Taste 'A' auch
    immer 'A' (65) unabhängig davon ob ich Shift gedrückt halte oder nicht.

    grüße


Anmelden zum Antworten