Mô hình sự kiện Windows chuẩn là cửa sổ có tiêu điểm bàn phím nhận tất cả các sự kiện bàn phím. Hãy nhớ rằng trong Windows, mọi thứ đều là một cửa sổ - một 'điều khiển' chỉ là một cửa sổ là con của một cửa sổ khác. Đó là vào cửa sổ đó để gửi tin nhắn cho cha mẹ của nó nếu nó chọn để làm như vậy, khi một số phím được nhấn.
Để chuẩn hóa điều hướng giữa các điều khiển trên hộp thoại, Windows cũng cung cấp 'trình quản lý hộp thoại'. Trong mã gốc, đối với các hộp thoại phương thức, điều này được xử lý bởi vòng lặp thông điệp phương thức bên trong hàm DialogBox
. Đối với các hộp thoại không mod, bạn phải gọi IsDialogMessage
trong vòng lặp tin nhắn của riêng bạn. Đây là cách nó đánh cắp các phím Tab và con trỏ để điều hướng giữa các điều khiển và nhấn Enter để nhấn nút mặc định. Điều này có tác dụng ngược lại là không cho phép các điều khiển xử lý Enter theo mặc định, điều khiển chỉnh sửa nhiều dòng thông thường sẽ xử lý. Để khám phá liệu một điều khiển có muốn xử lý một khóa hay không, mã trình quản lý hộp thoại sẽ gửi điều khiển được tập trung vào thông báo WM_GETDLGCODE
; nếu điều khiển phản hồi một cách thích hợp, trình quản lý hộp thoại trả lại FALSE
cho phép DispatchMessage
thực sự phân phối nó đến quy trình cửa sổ, nếu không trình quản lý hộp thoại sẽ thực hiện điều đó.
Windows Forms chủ yếu chỉ kết thúc các kiểm soát gốc cũ, do đó, nó phải phù hợp với mô hình sự kiện của Win32. Nó thực hiện cách tiếp cận quản lý hộp thoại tương tự - do đó tại sao nó không, theo mặc định, cho phép bạn xem Tab, Return và các phím con trỏ.
Cách tiếp cận được khuyến nghị, nếu bạn muốn xử lý một trong các khóa đó, là ghi đè PreviewKeyDown
và đặt thuộc tính PreviewKeyDownEventArgs
IsInputKey
thành true
.
Nguồn
2015-03-23 16:24:49
** Bạn có thể sử dụng thuộc tính này để xử lý hầu hết các lần nhấn phím trong ứng dụng của bạn và xử lý thao tác gõ phím hoặc gọi điều khiển thích hợp để xử lý thao tác gõ phím. Ví dụ, khi một ứng dụng sử dụng các phím chức năng, bạn có thể muốn xử lý các tổ hợp phím ở cấp biểu mẫu thay vì viết mã cho mỗi điều khiển có thể nhận các sự kiện tổ hợp phím. ** Từ http://msdn.microsoft.com/en-us /library/system.windows.forms.form.keypreview.aspx – rahul
Có. Và tại sao đây không phải là hành vi mặc định? –
Tôi chỉ gặp một trường hợp mà tôi đã không nhận được một sự kiện KeyDown cho phím Escape khi tập trung vào một điều khiển bên thứ 3 nhất định, ngay cả khi KeyPreview được đặt thành True. Rất may tôi đã tìm thấy bài đăng này và đã cố gắng ghi đè ProcessCmdKey cho điều khiển tùy chỉnh, điều này đã cho phép tôi lấy sự kiện quan trọng trước khi điều khiển đã thực hiện. Cảm ơn! – stone