Отключение переключателя num-lock в C#?

Я хотел бы поддерживать num-lock ON до тех пор, пока мое приложение работает, так что если пользователь отменяет переключение num-lock, оно немедленно переключается обратно. Какой самый простой способ добиться этого в C#?

Чтобы уточнить, что во время работы моего приложения я "владею" машиной пользователя, поэтому в моем конкретном случае пользователю не нужно будет отключать num-lock (это не означает, что у меня всегда есть фокус).

Спасибо

5 ответов

Включить Form.KeyPreview в форме добавьте ссылку на Microsoft.VisualBasic (или вы можете использовать собственный API напрямую для опроса состояния ключа блокировки num).

public static class NativeMethods
{
    public const byte VK_NUMLOCK = 0x90;
    public const uint KEYEVENTF_EXTENDEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 0x2;

    [DllImport("user32.dll")]
    public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

    public static void SimulateKeyPress(byte keyCode)
    {
        keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
}

public partial class Form1 : Form
{
    private bool protectKeys; // To protect from inifite keypress chain reactions

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (protectKeys)
            return;

        if (e.KeyCode == Keys.NumLock && 
            !(new Microsoft.VisualBasic.Devices.Keyboard().NumLock))
        {
            protectKeys = true;
            NativeMethods.SimulateKeyPress(NativeMethods.VK_NUMLOCK);
            protectKeys = false;
        }
    }
}

Вы можете сделать это с помощью нескольких вызовов P/Invoke. Проверьте эту страницу

Может быть, вы найдете полезную информацию по этой ссылке - http://www.codeproject.com/KB/statusbar/update_toggle_key_status.aspx

Вы должны добавить низкоуровневый хук клавиатуры для этого. Стивен Туб написал в своем блоге учебник по его настройке.

Ваш хук клавиатуры может проверить состояние VK_NUMLOCK. Для примера VB см. Здесь.

Смотрите эту ссылку

определите, выключен ли NumLock, и всегда включайте его снова

Код находится на vb.net, но может быть легко переведен на C#.

До свидания.

Другие вопросы по тегам