Mục đích
Thuộc tính Console.CapsLock và Console.NumberLock (static, read-only) trả về trạng thái phím **Caps Lock** và **Num Lock** trên bàn phím tại thời điểm gọi.
Ví dụ 1: Kiểm tra Caps Lock
using System;
public class Demo
{
public static void Main(string[] args)
{
Console.WriteLine($"Caps Lock is ON? {Console.CapsLock}");
}
}
Kết quả (ví dụ)
Caps Lock is ON? False
Ví dụ 2: Kiểm tra Num Lock
using System;
public class Demo
{
public static void Main(string[] args)
{
Console.WriteLine($"Num Lock is ON? {Console.NumberLock}");
}
}
Kết quả (ví dụ)
Num Lock is ON? True
Ví dụ 3: Theo dõi thay đổi trạng thái (Polling)
using System;
using System.Threading;
public class Demo
{
public static void Main()
{
bool lastCaps = Console.CapsLock;
bool lastNum = Console.NumberLock;
Console.WriteLine("Nhấn Caps Lock hoặc Num Lock để thấy thay đổi (Ctrl+C để thoát)...");
while (true)
{
bool curCaps = Console.CapsLock;
bool curNum = Console.NumberLock;
if (curCaps != lastCaps)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Caps Lock: {(curCaps ? "ON" : "OFF")}");
lastCaps = curCaps;
}
if (curNum != lastNum)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Num Lock: {(curNum ? "ON" : "OFF")}");
lastNum = curNum;
}
Thread.Sleep(200); // Poll 5 lần/giây
}
}
}
Lưu ý quan trọng
- Chỉ hoạt động trên **Windows** (console host). Trên Linux/macOS terminal thường trả về
falsehoặc némPlatformNotSupportedException. - Trạng thái được đọc từ **OS/hardware**, không phải từ buffer input của console.
- Không có event notification -> phải polling nếu muốn theo dõi real-time.
- Không thể **set** trạng thái (chỉ đọc). Để bật/tắt lập trình, cần P/Invoke
keybd_eventhoặcSendInput(user32.dll). - Không hoạt động qua SSH/RDP nếu không forward keyboard state.
Ứng dụng
- CLI tool: cảnh báo user "Caps Lock đang bật" khi nhập mật khẩu.
- Game/Console app: dùng Num Lock làm toggle chế độ.
- Accessibility: đọc trạng thái cho screen reader.