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

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:

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);
}

Tham khảo

MSDN:

Keys Enumeration

KeyEventArgs Class

https://yinyangit.wordpress.com

Advertisements

3 thoughts on “C# – Kiểm tra tổ hợp phím, phân biệt KeyCode, KeyValue và KeyData

  1. Pingback: C# – Kiểm tra tổ hợp phím, phân biệt KeyCode, KeyValue và KeyData | NGỌC TẤN KIẾN THỨC LẬP TRÌNH AN GIANG

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s