代码之家  ›  专栏  ›  技术社区  ›  Roee Adler

在C#中禁用num lock切换?

  •  4
  • Roee Adler  · 技术社区  · 16 年前

    只要我的应用程序在运行,我就希望保持num lock打开,这样,如果用户取消切换num lock,它将立即被切换回打开状态。在C#中实现这一点最简单的方法是什么?

    谢谢

    5 回复  |  直到 16 年前
        1
  •  1
  •   Thomas Levesque    16 年前

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

        2
  •  1
  •   Cecil Has a Name    16 年前

    使能 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;
            }
        }
    }
    
        3
  •  0
  •   Reed Copsey    16 年前

    要做到这一点,您需要添加一个低级键盘挂钩。斯蒂芬·图布写了一篇文章 tutorial on his blog 关于建立这个。

    VB example see here

    推荐文章