2009-02-23 22 views

回答

42

導入WinAPI的函數函數GetKeyState

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] 
public static extern short GetKeyState(int keyCode); 

,然後可以用它像

bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0; 
bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0; 
bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0; 

編輯:上述爲框架1.1,對於框架2.0 +可以使用

Control.IsKeyLocked

+1

我在這裏可能是錯的,但是這不會嚴格限制Windows版嗎?第一個選項直接掛鉤到一個.dll,而第二個需要System.Windows.Forms – 2015-05-16 12:26:32

+0

如果你不使用WinForms,(例如控制檯),你可以使用`(bool)Console.CapsLock`。 – 2017-04-18 11:50:21

10

如果有人遇到這個線程,而在WPF開發時,可以使用被介紹在.NET中3.0 Keyboard.IsToggled方法:

var isNumLockToggled = Keyboard.IsKeyToggled(Key.NumLock); 
var isCapsLockToggled = Keyboard.IsKeyToggled(Key.CapsLock); 
var isScrollLockToggled = Keyboard.IsKeyToggled(Key.Scroll); 

你如果它不在那裏:

using System.Windows.Input; 
不得不添加以下 using指令

在內部,IsToggled()方法檢查是否爲指定的鍵設置了KeyStates.Toggled標誌。

[Flags] 
public enum KeyStates : byte 
{ 
    None = (byte) 0, 
    Down = (byte) 1, 
    Toggled = (byte) 2, 
} 
4

檢查國家

要檢查的狀態的CapsLock的NumLockScrollLock鍵鍵,你可以使用 Control.IsKeyLocked方法:

var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock); 

積極展現站te

由於鎖定鍵可以打開或關閉,當您的應用程序沒有焦點處理的形式的鍵盤事件不足以檢測鍵鎖定狀態的變化,你也應該把你的邏輯一些其他地方,如表單的激活事件,或者你需要註冊一個全局鍵盤鉤子。

作爲一種簡單可靠的解決方案,您可以在Application.Idle事件中檢查其狀態。當表單關閉時,您必須分離空閒事件處理程序。

public Form1() 
{ 
    InitializeComponent(); 
    Application.Idle += Application_Idle; 
} 

void Application_Idle(object sender, EventArgs e) 
{ 
    if (Control.IsKeyLocked(Keys.CapsLock)) 
     toolStripStatusLabel1.Text = "CapsLock is On"; 
    else 
     toolStripStatusLabel1.Text = ""; 
} 

protected override void OnFormClosed(FormClosedEventArgs e) 
{ 
    Application.Idle -= Application_Idle; 
    base.OnFormClosed(e); 
} 
相關問題