C# –Kiểm tra tổ hợp phím phân biệt KeyCode, KeyValue KeyData

Thảo luận trong 'C#.NET, Windows Form' bắt đầu bởi nhatlectv, 7/5/16.

  1. nhatlectv

    nhatlectv Stanford - Nâng tầm tri thức Thành viên BQT

    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:



    Name

    Type

    Description

    KeyCode

    System.Windows.Forms.Keys

    Trả 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.

    KeyValue

    int

    Giá trị của KeyCode theo kiểu integer

    KeyData

    System.Windows.Forms.Keys

    Giá 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);

    }

    Theo dõi diễn đàn để tiếp tục theo dõi các loạt bài mới nhất về C# nhé!
     

Chia sẻ trang này