只要我的应用程序正在运行,我想保持num-lock ON,这样如果用户取消切换num-lock,它将立即切换回来。在C#中实现这一目标的最简单方法是什么?
为了澄清,当我的应用程序运行时,我“拥有”用户的机器,因此在我的特定情况下,用户不需要切换数字锁定(这并不意味着我完全关注次)。
由于
答案 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)