DevTips.NET

Caps-lock, Num-lock en Scroll-lock aan- en uitzetten

In C# en VB.NET kan je via Console.CapsLock controleren of de Caps-lock toets is ingeschakeld. Idem voor Console.NumberLock. Vreemd genoeg niet voor Scroll-lock.  In VB.NET heb je ook de My.Computer.Keyboard klasse, waar wel de status van Scroll-lock kan worden opgevraagd.

In de Win32 API beschikken we ook over de functie SetKeyboardState(). Maar deze functie is niet te gebruiken om de Caps-lock, Scroll-lock en Num-lock toetsen in- of uit te schakelen. Hoe dat wel kan staat in dit codeknipsel.

De volgende code laat een speelse manier zien waarop deze klasse gebruikt kan worden: 

        ToggleKeys t = new ToggleKeys();
        for (int i = 0; i < 50; i++)
        {  
            t.ToggleNumLock();
            System.Threading.Thread.Sleep(200);
            t.ToggleCapsLock();
            System.Threading.Thread.Sleep(200);
            t.ToggleScrollLock();
            System.Threading.Thread.Sleep(200);           
        }

Veel plezier ermee!

.NET C#

Code

using System;
using System.Runtime.InteropServices;
 
public class ToggleKeys
{
    // API declarations:
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern void keybd_event(byte bVk, byte bScan, long dwFlags, long dwExtraInfo);
 
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern long GetKeyboardState(byte pbKeyState);
 
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern long SetKeyboardState(byte lppbKeyState);
 
    // Constant declarations:
    const int VK_NUMLOCK = 0x90;
    const int VK_SCROLL = 0x91;
    const int VK_CAPITAL = 0x14;
    const int KEYEVENTF_EXTENDEDKEY = 0x1;
    const int KEYEVENTF_KEYUP = 0x2;
 
    private bool NumLockState;
    private bool ScrollLockState;
    private bool CapsLockState;
 
    private byte[] keys = new byte[256];
 
    public void ToggleNumLock()
    {
        GetKeyboardState(keys[0]);
        // NumLock handling:
 
        NumLockState = Convert.ToBoolean(keys[VK_NUMLOCK]);
        if (NumLockState != true) //Turn numlock on
        {
            //Simulate Key Press
            keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
            //Simulate Key Release
            keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
    }
 
    public void ToggleCapsLock()
    {
        GetKeyboardState(keys[0]);
        // CapsLock handling:
        CapsLockState = Convert.ToBoolean(keys[VK_CAPITAL]);
        if (CapsLockState != true) //Turn capslock on
        {
            //Simulate Key Press
            keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
            //Simulate Key Release
            keybd_event(VK_CAPITAL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
    }
 
    public void ToggleScrollLock()
    {
        GetKeyboardState(keys[0]);
        // ScrollLock handling:
        ScrollLockState = Convert.ToBoolean(keys[VK_SCROLL]);
        if (ScrollLockState != true) //Turn Scroll lock on
        {
            //Simulate Key Press
            keybd_event(VK_SCROLL, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
            //Simulate Key Release
            keybd_event(VK_SCROLL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
    }
}
comments powered by Disqus