Tôi đã nhìn thấy một số câu trả lời cho thấy việc sử dụng Keyboard.Modifiers
để xác định xem sự kiện KeyDown
có dành cho khóa có bộ sửa đổi hay không. Thật không may, vì Keyboard.Modifiers
trả lại trạng thái hiện tại của các công cụ sửa đổi (thay vì trạng thái của công cụ sửa đổi khi phím được nhấn), điều này dẫn đến một lỗi liên tục gây phiền nhiễu cho người đánh máy nhanh.Cách lấy đúng các phím bổ trợ trong sự kiện WPF KeyDown?
Cụ thể, hãy tưởng tượng ai đó nhấn Ctrl + A và giải phóng Ctrl chỉ sau vài giây sau khi nhấn A. Bây giờ hãy tưởng tượng rằng hệ thống đang chịu tải nặng; trình xử lý khóa bắt đầu thực hiện nhưng được ưu tiên 50ms. Vào thời điểm trình xử lý khóa đang thực hiện lại, trạng thái hiện tại của trạng thái là "được giải phóng". Trình xử lý khóa giờ đây sẽ nghĩ rằng "A" được nhấn mà không có Ctrl và đây là xấu.
Tương tự, nếu một nhân viên đánh máy nhanh vào A, Ctrl + End và ứng dụng của tôi sử dụng Keyboard.Modifiers
, nó thay vì có thể sẽ quan sát Ctrl + A ...
Trong WinForms, sự kiện KeyDown
nói với tôi tình trạng Ctrl chính xác, ngay cả khi nó đã được phát hành vào thời điểm sự kiện đang được xử lý. Làm thế nào tôi có thể có được hành vi tương tự trong WPF?
Chỉnh sửa: có thể là Keyboard.Modifiers không thực sự truy xuất các phím bổ trợ "hiện tại", mà thay vào đó các phím bổ trợ liên quan đến thông báo chính hiện đang được xử lý. Trong WinAPI, đây là sự khác biệt giữa các hàm trạng thái khóa "không đồng bộ" và không đồng bộ. Thật không may, the documentation không đề cập đến chính xác "hiện tại". Nếu có ai biết, hãy nói như vậy.
bạn có chắc chắn không? Tôi không tìm thấy bất kỳ gợi ý nào về msdn, điều đó sẽ chứng minh lý thuyết của bạn ... nó sẽ thực sự lạ, các đối số xử lý không bao gồm các phím được nhấn ORIGINALLY ... nếu bạn liên kết với "onkeyDown" và người dùng nhấn CONTROL (giữ) và sau đó a, sau đó phát hành CONTROL, sự kiện sẽ được kích hoạt 2 lần! trước tiên chỉ bằng "Điều khiển", sau đó với CONTROL + A ... một chút lạ - imho, chúng tôi có thể tìm ra dễ dàng với thread.sleep ... tôi có phải khởi động VS không ngay bây giờ? ;) – TheHe
@TheHe Các đối số trình xử lý bao gồm _key_ được nhấn ban đầu, nhưng không phải là thông tin khóa bổ trợ. Trong WinAPI cũ tốt, các phím bổ trợ được truyền cùng với thông điệp. Điều tương tự cũng xảy ra trong WinForms. Tài liệu thực sự cảnh báo bạn không nên thử và xử lý trạng thái _current_; ví dụ: nếu ứng dụng không phản hồi vì bất kỳ lý do gì (ví dụ: HDD thrashing), trình xử lý có thể được gọi _seconds_ sau khi thực tế. –