Làm thế nào để phát hiện các trạng thái khóa sửa đổi trong WPF?


151

Có một số cấu trúc toàn cầu mà tôi có thể sử dụng bất cứ khi nào tôi cần truy cập xem các nút Control, Shift, Alt có bị hỏng không? Ví dụ bên trong MouseDownsự kiện của a TreeView.

Nếu vậy thì thế nào?

Câu trả lời:


257

Sử dụng lớp học Keyboard. Sử dụng Keyboard.IsKeyDownbạn có thể kiểm tra xem Control, Shift, Alt có bị hỏng không.

Đối với ca:

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }

Để kiểm soát:

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }

Đối với Alt:

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }

125

Ngoài ra còn có:

// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{

}

13
Giải pháp tốt hơn nhiều. Nó cũng cho phép bạn kiểm tra tất cả các sửa đổi cùng một lúc. Nếu bạn muốn xử lý Ctrl + F, bạn sẽ không muốn xử lý Ctrl + Shift + F, vì vậy bạn chỉ cần kiểm tra (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)thay vì tất cả những thứ khác ...
ygoe

35
Lưu ý rằng các so sánh trong các ví dụ trên tạo ra kết quả khác nhau! Vì enum ModifierKeys có thuộc tính Flags, bạn có thể có bất kỳ kết hợp giá trị nào trong enum. Nếu bạn muốn bắt CHỈ phím shift được nhấn, hãy sử dụng Keyboard.Modifiers == ModifierKeys.Shiftcâu lệnh. Nếu bạn muốn bắt phím shift nhưng không quan tâm nếu các công cụ sửa đổi khác được nhấn cùng lúc, hãy sử dụng (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shiftcú pháp HasFlag tốt hơn nhiềuKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
Patrik B

4
Tôi không thể bắt được công cụ sửa đổi khóa windows bằng phương pháp này. (CTRL hoạt động tốt.) Tôi đã cố gắng để bắt WIN+RightArrow.
ANeves

1
@ANeves Thú vị, Keyboard.Modifiershiển thị nhưNone
Chuck Savage

8
    private bool IsShiftKey { get; set; }

    private void OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;

        if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
        {
           e.Handled = true;
        }
    }

2
Câu trả lời là tốt hơn với bình luận cũng như mã. Vui lòng cung cấp một số bối cảnh.
Chris

1
ý tưởng tuyệt vời của việc thêm nó như một proprerty
RollRoll

1
Khi tôi sử dụng PreviewKeyDown để tìm Alt + một khóa khác, tôi phải sử dụng e.SystemKey thay vì e.Key (giá trị của e.Key là "Hệ thống" trong trường hợp sử dụng alt + ký tự khác, trong trường hợp của tôi)
Josh

3

Đây là cách tôi xử lý nó (sử dụng PreviewKeyDown), giả sử chúng ta đang tìm kiếm Alt + R ...

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
       && e.SystemKey == Key.R)
    {
       //do whatever
    }
}

Có lẽ ai đó có thể làm rõ lý do tại sao tôi phải sử dụng e.SystemKey và không chỉ e.Key, có thể do công cụ sửa đổi? nhưng điều này đã làm việc hoàn hảo cho tôi khi tìm kiếm phím bổ trợ +.


0

và cũng như:

nếu My.Computer.Pal.ShiftKeyDown thì ...

My.Computer .Pal.CtrlKeyDown

My.Computer .Pal.AltKeyDown


0

Mượn một phần từ @Josh, và hơi giống với @Krushik, và cũng tham khảo một câu hỏi về Sự khác biệt giữa KeyEventArgs.systemKey và KeyEventArgs.Key (trả lời tại sao Josh phải sử dụng SystemKey); trong đó, với các phím bổ trợ (như Alt), e.Key trả về Key.System và do đó, khóa 'thực' nằm trong e.SystemKey.

Một cách để giải quyết vấn đề này là trước tiên hãy tìm khóa 'thực' và sau đó thực hiện điều kiện của bạn:

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    // Fetch the real key.
    var key = e.Key == Key.System ? e.SystemKey : e.Key;

    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
        && key == Key.Return)
    {
        // Execute your code.
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.