2009-08-28 2 views
4

Я хотел бы поддерживать num-lock ON до тех пор, пока мое приложение запущено, так что если пользователь не переключит num-lock, он будет немедленно переключен обратно. Каков самый простой способ добиться этого в C#?Отключить переключатель num-lock в C#?

Чтобы уточнить, в то время как мое приложение работает, я «владею» машиной пользователя, поэтому в моем конкретном случае пользователю не нужно будет отключать num-lock (это не значит, что у меня есть фокус на все время).

Благодаря

+0

Говоря, что вы «владеете» машиной, можно сказать, что ваше приложение имеет фокус в 100% случаев? Как и в, делает ли операция в KeyDown или ProcessCmdKey допустимой? –

+0

@Walt W: У меня может не быть фокуса во все времена, отредактировал вопрос. –

ответ

0

Вы должны добавить уровень хук клавиатуры низко, чтобы сделать это. Стивен Тууб написал tutorial on his blog об установке этого.

Ваш крючок клавиатуры может проверить состояние VK_NUMLOCK. Для VB example see here.

1

Вы можете сделать это с помощью нескольких вызовов P/Invoke. Проверьте this page

+1

Это просто проверяет его, но не сообщает вам, КОГДА оно изменяется. Чтобы обнаружить действие пользователя, изменяющего ключ блокировки num, требуется крючок с низким уровнем клавиатуры –

1

Включите 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; 
     } 
    } 
} 
Смежные вопросы