首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中禁用数字锁切换?

在C#中禁用数字锁切换?
EN

Stack Overflow用户
提问于 2009-08-28 15:34:22
回答 3查看 4K关注 0票数 5

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

为了澄清,当我的应用程序运行时,我“拥有”用户的机器,所以在我的特定情况下,用户不需要取消num-lock (这并不意味着我一直都有焦点)。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2009-08-28 15:40:41

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

票数 1
EN

Stack Overflow用户

发布于 2009-08-28 15:55:38

在您的表单上启用Form.KeyPreview,添加对Microsoft.VisualBasic的引用(或者您可以直接使用本机API来轮询数字锁密钥的状态)。

代码语言:javascript
复制
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;
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-08-28 15:39:25

为此,您需要添加一个低级键盘钩子。Stephen Toub写了一个关于设置这个的tutorial on his blog

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1347774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档