2009-08-28 21 views
4

我想保持NUM-鎖,只要我的應用程序正在運行,因此,如果用戶未切換NUM鎖,它就會立即被重新觸發。在C#中實現這個最簡單的方法是什麼?在C#中禁用num-lock切換?

爲了澄清,在我的應用程序運行時,我「擁有」了用戶的機器,因此在我的具體情況下,用戶不需要解除num-lock的鎖定(這並不意味着我專注於一直)。

謝謝

+0

通過說你自己的機器,是說你的應用程序有100%的時間重點?在中,正在KeyDown或ProcessCmdKey中執行有效的操作? – 2009-08-28 15:38:54

+0

@Walt女:我可能不會在任何時候都具有焦點,編輯的問題。 – 2009-08-28 15:41:59

回答

0

您需要添加一個低級別的鍵盤鉤子才能做到這一點。 Stephen Toub在設置這個時寫了一個tutorial on his blog

你的鍵盤鉤子可以檢查VK_NUMLOCK的狀態。對於VB example see here

1

您可以用幾個P做/ Invoke調用。退房this page

+1

這只是檢查它,但不告訴你什麼時候改變。要檢測用戶更改數字鎖定鍵的操作,需要使用低級別鍵盤鉤子 – 2009-08-28 15:41:11

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; 
     } 
    } 
}