Phân biệt KeyCode, KeyValue và KeyData trong Windows Form

Bài viết này nhằm giải đáp các thắc mắc về kiểm tra tổ hợp phím được nhấn trong Windows Form mà không dùng Windows API. Ta sẽ cùng tìm hiểu về enum Keys, lớp KeyEventArgs và phân biệt các property KeyCode, KeyValue, KeyData của lớp này.

KeyEventArgs.Modifiers

Giá trị này của của enum System.Windows.Forms.Keys, giúp xác định được các phím modifier nào được nhấn (SHIFT, CTRL và ALT). Property này chỉ trả về các giá trị của các phím SHIFT, CTRL, ALT và None (không phím nào được nhấn), ngoài ra có thể kiểm tra kết hợp các phím bằng toán tử OR ‘|’.

Ví dụ sau kiểm tra cả ba phím Control, Shift và Alt được nhấn cùng lúc:

protected override void OnKeyDown(KeyEventArgs e)
{
    if(e.Modifiers==(Keys.Control | Keys.Shift | Keys.Alt))
        // do something
    base.OnKeyDown(e);
}

Thay vì lấy giá trị này của đối tượng KeyEventArgs, bạn có thể lấy trực tiếp từ static property Control.ModifierKeys:

if(Control.ModifierKeys==(Keys.Control | Keys.Shift | Keys.Alt))
    // do something

Phân biệt KeyCode, KeyValue và KeyData

Đây là các property dễ bị nhầm lẫn của KeyEventArgs. Bảng sau sẽ giúp bạn phân biệt được 3 property này:

NameTypeDescription
KeyCodeSystem.Windows.Forms.KeysTrả về một giá trị trong enum Keys tương đương với một phím được nhấn. Ví dụ nếu bạn giữ CTRL và nhấn A, thì KeyCode sẽ trả về Keys.A.
KeyValueintGiá trị của KeyCode theo kiểu integer
KeyDataSystem.Windows.Forms.KeysGiá trị kiểu Keys kết hợp bởi nhiều phím (các phím modifier và phím thông thường)

Từ sự khác biệt này, khi cần kiểm tra tổ hợp phím được nhấn,  bạn cần sử dụng KeyData thay vì KeyCode. Ví dụ sau kiểm tra tổ hợp phím Ctrl+A trong sự kiện KeyDown:

protected override void OnKeyDown(KeyEventArgs e)
{
    if(e.KeyCode==(Keys.Control | Keys.A))
        // do something
    base.OnKeyDown(e);
}

Lớp KeyEventArgs cũng cung cấp các property Shift, Control, Alt có kiểu Boolean để kiểm tra modifier tương ứng có được nhấn không. Vì vậy ví dụ trên có thể được viết theo cách khác và không cần toán tử:

protected override void OnKeyDown(KeyEventArgs e)
{
    if(e.Control && e.KeyCode==Keys.A)
        // do something
    base.OnKeyDown(e);
}