我想保持NUM-鎖,只要我的應用程序正在運行,因此,如果用戶未切換NUM鎖,它就會立即被重新觸發。在C#中實現這個最簡單的方法是什麼?在C#中禁用num-lock切換?
爲了澄清,在我的應用程序運行時,我「擁有」了用戶的機器,因此在我的具體情況下,用戶不需要解除num-lock的鎖定(這並不意味着我專注於一直)。
謝謝
我想保持NUM-鎖,只要我的應用程序正在運行,因此,如果用戶未切換NUM鎖,它就會立即被重新觸發。在C#中實現這個最簡單的方法是什麼?在C#中禁用num-lock切換?
爲了澄清,在我的應用程序運行時,我「擁有」了用戶的機器,因此在我的具體情況下,用戶不需要解除num-lock的鎖定(這並不意味着我專注於一直)。
謝謝
您需要添加一個低級別的鍵盤鉤子才能做到這一點。 Stephen Toub在設置這個時寫了一個tutorial on his blog。
你的鍵盤鉤子可以檢查VK_NUMLOCK的狀態。對於VB example see here。
您可以用幾個P做/ Invoke調用。退房this page
這只是檢查它,但不告訴你什麼時候改變。要檢測用戶更改數字鎖定鍵的操作,需要使用低級別鍵盤鉤子 – 2009-08-28 15:41:11
可能你會發現從這個鏈接有用的信息 - http://www.codeproject.com/KB/statusbar/update_toggle_key_status.aspx
在窗體上啓用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;
}
}
}
通過說你自己的機器,是說你的應用程序有100%的時間重點?在中,正在KeyDown或ProcessCmdKey中執行有效的操作? – 2009-08-28 15:38:54
@Walt女:我可能不會在任何時候都具有焦點,編輯的問題。 – 2009-08-28 15:41:59