5

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

澄清一下,当我的应用程序运行时,我“拥有”用户的机器,所以在我的具体情况下,用户不需要取消切换数字锁定(这并不意味着我一直都专注)。

谢谢

4

3 回答 3

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;
        }
    }
}
于 2009-08-28T15:55:37.587 回答
1

您可以通过几个 P/Invoke 调用来完成。看看这个页面

于 2009-08-28T15:40:41.423 回答
0

您需要添加一个低级键盘挂钩来执行此操作。Stephen Toub在他的博客上写了一篇关于设置的教程。

您的键盘挂钩可以检查 VK_NUMLOCK 的状态。有关VB 示例,请参见此处

于 2009-08-28T15:39:24.763 回答