只要我的应用程序正在运行,我想保持 num-lock ON,这样如果用户取消切换 num-lock,它将立即重新打开。在 C# 中实现这一目标的最简单方法是什么?
澄清一下,当我的应用程序运行时,我“拥有”用户的机器,所以在我的具体情况下,用户不需要取消切换数字锁定(这并不意味着我一直都专注)。
谢谢
在您的表单上启用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;
}
}
}
您可以通过几个 P/Invoke 调用来完成。看看这个页面
您需要添加一个低级键盘挂钩来执行此操作。Stephen Toub在他的博客上写了一篇关于设置的教程。
您的键盘挂钩可以检查 VK_NUMLOCK 的状态。有关VB 示例,请参见此处。