在C#中禁用num-lock切换?

时间:2009-08-28 15:34:22

标签: c# num-lock

只要我的应用程序正在运行,我想保持num-lock ON,这样如果用户取消切换num-lock,它将立即切换回来。在C#中实现这一目标的最简单方法是什么?

为了澄清,当我的应用程序运行时,我“拥有”用户的机器,因此在我的特定情况下,用户不需要切换数字锁定(这并不意味着我完全关注次)。

由于

5 个答案:

答案 0 :(得分:1)

您可以通过几个P / Invoke调用来完成。查看this page

答案 1 :(得分:1)

在表单上启用Form.KeyPreview,添加对Microsoft.VisualBasic的引用(或者您可以直接使用本机API轮询num lock键的状态)。

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;
        }
    }
}

答案 2 :(得分:0)

您需要添加一个低级键盘钩来执行此操作。斯蒂芬·图布写了tutorial on his blog来设置它。

您的键盘钩子可以检查VK_NUMLOCK的状态。对于VB example see here

答案 3 :(得分:0)

您可以从此链接中找到有用的信息 - http://www.codeproject.com/KB/statusbar/update_toggle_key_status.aspx

答案 4 :(得分:0)

请参阅此链接

detect if NumLock is OFF and turn it always back ON

代码在vb.net中,但可以很容易地转换为c#。

再见。