2009-05-01 55 views
60

Điều gì sẽ là một số mẫu mã mà sẽ bẫy Ctrl +TabCtrl +phím Shift +Tab cho một ứng dụng WPF?Cách chụp Ctrl + Tab và Ctrl + Shift + Tab trong WPF?

Chúng tôi đã tạo các sự kiện KeyDown và cũng đã thử thêm các ràng buộc lệnh với các cử chỉ nhập, nhưng chúng tôi không bao giờ có thể bẫy hai phím tắt này.

Trả lời

91

Trình xử lý KeyDown nào bạn có? Mã bên dưới hoạt động cho tôi. Một trong đó mang lại cho tôi rắc rối là: Alt +Tab, nhưng bạn đã không yêu cầu rằng: D

public Window1() 
{ 
    InitializeComponent(); 
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
} 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
    { 
     MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
    } 

    if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     MessageBox.Show("CTRL + TAB trapped"); 
    } 
} 
+0

Siz, nhờ ... mà không làm việc cho WPF của chúng tôi. Chúng tôi cũng có một XBAP mà chúng ta cần phải bẫy nó và nó dường như không hoạt động trên XBAP. Bất kỳ ý tưởng về làm thế nào để làm điều này với một XBAP là tốt? – FarrEver

+1

Có cách nào xamly để làm điều đó không? – Shimmy

+13

@siz Bạn có thể dọn sạch các câu lệnh If bằng cách sử dụng cú pháp sau: 'Keyboard.Modifiers.HasFlag (ModifierKeys.Control)' – Pakman

8

Bạn phải sử dụng KeyUp sự kiện, không KeyDown ...

+2

Thú vị. Chưa thử điều này, nhưng bạn có thể giải thích tại sao không? –

+7

Chắc chắn Siz. Khi bạn đang cố gắng chụp 2 hoặc nhiều lần nhấn phím cùng một lúc, bạn không thể sử dụng tính năng Kiểm tra KeyDown cho e.Key vì nó sẽ chụp một khóa tại một thời điểm. Nếu KeyDown là cần thiết, giống như làm một cái gì đó khi người dùng đang nắm giữ một tổ hợp phím ví dụ, bạn nên sử dụng KeyDown và lớp Keyboard, cụ thể IsKeyDown(), kiểm tra cho các phím cụ thể. –

+1

Xin lỗi, tôi không hiểu bạn đang cố nói gì ở đây. Sự kiện KeyUp cũng chỉ chuyển một giá trị Key trong e.Key. Bạn có thể đưa ra một ví dụ cụ thể khi xử lý KeyUp thay vì KeyDown sẽ tốt hơn cho việc "chụp 2 hoặc nhiều lần nhấn phím cùng một lúc" không? Cảm ơn. –

30

Câu trả lời của Gustavo chính xác là những gì tôi đang tìm kiếm. Chúng tôi muốn xác nhận phím nhập, nhưng vẫn cho phép dán:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
     return; 
} 
+0

Đáng buồn thay, điều này sẽ không xử lý khi người dùng sử dụng nút Ctrl bên phải :-) –

1

Hi bạn có thể sử dụng này về sự kiện KeyDown

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      // 
      // TODO: somthing here 
      // 
     } 
    } 
+0

Vấn đề ở đây cũng là nếu tôi thêm một câu lệnh if if (Keyboard.IsKeyDown (Key.LeftCtrl) && Keyboard.IsKeyDown (Key.Tab)). Cả hai câu lệnh sẽ được thực hiện nếu tôi nhấn Ctrl + Shift + Tab – Devid

+0

trong trường hợp này, bạn có thể đặt hủy = true; trong cả hai câu lệnh khi nhấn Ctrl + Shift + Tab – luka

1

phiên bản của Szymon Rozga câu trả lời (Làm việc xin lỗi, tôi không thể bình luận). Chúng tôi không nhìn Alt, nhưng nó chiếm có thể chỉ cần thêm vào lúc đầu nếu

public View() 
    { 
    InitializeComponent(); 
    AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent); 
    } 

    private void controlKeyDownEvent(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
    { 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
     else 
      MessageBox.Show("CTRL + TAB trapped"); 
    } 
    } 
Các vấn đề liên quan