2012-02-28 30 views
8

Tôi có một chút C# console ứng dụng mà đọc một chìa khóa và kiểm tra xem nếu phím là một dấu chấm hỏi:ConsoleKeyInfo, câu hỏi Mark và Portability

ConsoleKeyInfo ki = System.Console.ReadKey(); 
if (ki.ConsoleKey.Oem2) // Do something 

tôi đến Oem2 bằng cách nhìn thấy những gì giá trị thực được chỉ định trong trình gỡ lỗi, vì không có ConsoleKey code cho dấu chấm hỏi.

Bây giờ tôi chắc chắn có thể sử dụng ki.KeyChar thay vào đó, nhưng ứng dụng cũng cần phản hồi một số phím nhất định (ví dụ: khóa phương tiện) không ánh xạ tới các ký tự. Nó cảm thấy không thích hợp để kiểm tra cả hai số ConsoleKeyKeyChar để xác định khóa nào đã được nhấn thực tế. Mặt khác, không cảm thấy an toàn khi dựa vào Oem2 để luôn luôn lập bản đồ đến ? trong mọi trường hợp và khu vực.

Thực tiễn tốt nhất là kiểm tra cả hai thuộc tính để xác định khóa nào đã được nhấn thực tế?

Bất kỳ thông tin chi tiết nào về lý do tại sao ConsoleKeyInfo được thiết kế theo cách này được đánh giá cao.

Trả lời

6

Trong trường hợp này, bạn sẽ phải kiểm tra KeyChar == '?'. Từ MSDN:

Oem2: Khóa OEM 2 (OEM cụ thể).

Vì vậy, bạn thật may mắn khi thấy nó là ? trên thiết bị của bạn.

Cấu trúc ConsoleKeyInfo cung cấp KeyChar (giá trị Char) cũng như Modifiers (liệt kê) để giúp bạn quyết định những phím nào người dùng đã nhấn.

2

Tôi nghĩ bạn nên cân nhắc điều gì xảy ra khi ai đó có bố cục bàn phím khác.

Nếu bạn muốn kiểm tra “khóa có dấu chấm hỏi trên máy tính của tôi”, sau đó sử dụng ConsoleKey. Nhưng đó có lẽ không phải là một ý tưởng hay và có lẽ bạn nên tuân theo cài đặt của người dùng và sử dụng KeyChar.

Nhưng đối với các khóa không ánh xạ tới ký tự (và người dùng không thể remap chúng bằng cách sử dụng bố trí bàn phím khác nhau), bạn phải sử dụng ConsoleKey.

Vì vậy, có, tôi nghĩ bạn nên kiểm tra cả hai thuộc tính trong trường hợp này.

2

Tôi đoán lý do cho thiết kế này là Console.ReadKey() dựa vào một chức năng có nguồn gốc (ReadConsoleInput) trả về một mảng của KEY_EVENT_RECORD cấu trúc trong trường hợp một phím nhấn, trong đó mỗi sự kiện quan trọng có một ASCII/đại diện ký tự Unicode và một virtual key code. Lưu ý VK_OEM_2 trong liên kết trước của tôi - đây là nơi giá trị ConsoleKey.Oem2 xuất phát từ đó.