Отключение переключателя num-lock в C#?
Я хотел бы поддерживать num-lock ON до тех пор, пока мое приложение работает, так что если пользователь отменяет переключение num-lock, оно немедленно переключается обратно. Какой самый простой способ добиться этого в C#?
Чтобы уточнить, что во время работы моего приложения я "владею" машиной пользователя, поэтому в моем конкретном случае пользователю не нужно будет отключать num-lock (это не означает, что у меня всегда есть фокус).
Спасибо
5 ответов
Включить Form.KeyPreview
в форме добавьте ссылку на Microsoft.VisualBasic
(или вы можете использовать собственный API напрямую для опроса состояния ключа блокировки num).
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. Проверьте эту страницу
Может быть, вы найдете полезную информацию по этой ссылке - http://www.codeproject.com/KB/statusbar/update_toggle_key_status.aspx
Вы должны добавить низкоуровневый хук клавиатуры для этого. Стивен Туб написал в своем блоге учебник по его настройке.
Ваш хук клавиатуры может проверить состояние VK_NUMLOCK. Для примера VB см. Здесь.
Смотрите эту ссылку
определите, выключен ли NumLock, и всегда включайте его снова
Код находится на vb.net, но может быть легко переведен на C#.
До свидания.