2009-06-10 8 views
33

Trong ứng dụng C# của tôi, tôi muốn hiển thị menu ngữ cảnh, nhưng tôi muốn thêm các tùy chọn đặc biệt vào menu nếu phím SHIFT đang được giữ khi bối cảnh menu được mở.C# - Phát hiện nếu phím SHIFT được giữ khi mở menu ngữ cảnh

Tôi hiện đang sử dụng API GetKeyState để kiểm tra khóa SHIFT. Nó hoạt động tốt trên máy tính của tôi nhưng người dùng với Windows không phải tiếng Anh nói rằng nó không làm việc ở tất cả cho họ.

Tôi cũng đọc điều đó trong API Win32 khi một menu ngữ cảnh được mở ra có một lá cờ cho biết trong trình đơn sẽ hiển thị EXTENDEDVERBS. Trong C# EventArgs cho sự kiện Opening không chứa (từ những gì tôi có thể biết) một thuộc tính cho biết EXTENDEDVERBS hoặc nếu bất kỳ phím bổ trợ nào được nhấn.

Dưới đây là đoạn code tôi đang sử dụng hiện đang nằm trong sự kiện "Opening":

// SHIFT KEY is being held down 
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000)) 
{ 
    _menuStrip.Items.Add(new ToolStripSeparator()); 

    ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging"); 
    log.Click += new EventHandler(log_Click); 
    log.Checked = Settings.Setting.EnableDebugLogging; 
    _menuStrip.Items.Add(log); 
} 

Nếu GetKeyState là đúng cách để làm việc đó, là mã của tôi đúng phát hiện phím SHIFT bị ép?

Trả lời

60

Bạn có thể sử dụng phím điều khiển ModifierKeys static property để xác định xem phím shift có đang được giữ hay không.

if (Control.ModifierKeys == Keys.Shift) { 
    ... 
} 

Đây là phong cách cờ enum dù vậy tùy thuộc vào trường hợp bạn có thể muốn làm thử nghiệm nghiêm ngặt hơn.

Cũng lưu ý rằng điều này sẽ kiểm tra xem liệu phím Shift có được giữ tại thời điểm bạn kiểm tra giá trị hay không. Không phải lúc mở menu được bắt đầu. Đó có thể không phải là một sự khác biệt đáng kể cho ứng dụng của bạn nhưng đáng chú ý.

+0

Thật không may, cha mẹ của ContextMenu trong mã của tôi là một UserControl và thuộc tính ModifierKeys không khả dụng cho UserContr ol hoặc đối tượng ContextMenu. –

+0

@Chris - Như Jared nói nó tĩnh. Tôi đã cập nhật câu trả lời của mình bằng một liên kết đến msdn –

+0

Tôi không nhận thấy điều đó. Tôi đã nghĩ rằng đó là một tài sản cá thể. Tôi sẽ kiểm tra nó. –

37

Sử dụng này để phát hiện nếu phím shift được nhấn:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
+0

Khi tôi nhập câu trả lời này, Jared đã đăng nó. Xin lỗi vì trùng lặp. – bobbyalex

+0

Chris nói đúng. Các tài sản nên có sẵn cho bạn ngay cả khi bạn đang sử dụng một UserControl. – bobbyalex

+11

Điều này sẽ kiểm tra nếu phím Shift được nhấn, đó là những gì câu hỏi ban đầu muốn. Câu trả lời khác sẽ kiểm tra nếu CHỈ nhấn phím Shift. – adzm

3

Trong Silverlight, ít nhất là trong các phiên bản mới nhất, bạn phải sử dụng:

if(Keyboard.Modifiers == ModifierKeys.Shift) { 
    ... 
} 
12

Nó thực sự đơn giản hơn nhiều so với bất kỳ mà

  if(Keyboard.IsKeyDown(Key.LeftCtrl) || 
       Keyboard.IsKeyDown(Key.RightCtrl) || 
       Keyboard.IsKeyDown(Key.LeftAlt) || 
       Keyboard.IsKeyDown(Key.RightAlt) || 
       Keyboard.IsKeyDown(Key.LeftShift) || 
       Keyboard.IsKeyDown(Key.RightShift)) 
      { 
       /** do something */ 
      } 

Chỉ cần đảm bảo tham chiếu dự án của bạn PresentationCore và WindowsBase

2

Keyboard.Modifiers cũng hoạt động với các dự án WPF thực tế!
Ngoài ra tôi khuyên bạn nên sử dụng nó trên Keyboard.GetKeyStates vì sau này sử dụng kích hoạt và có thể không phản ánh trạng thái khóa thực.

Cũng lưu ý rằng điều này sẽ kích hoạt CHỈ nếu sự thay đổi quan trọng modifier là xuống và không có gì khác:

if(Keyboard.Modifiers == ModifierKeys.Shift) 
{ ... } 

Nếu bạn chỉ muốn để phát hiện nếu thay đổi quan trọng là xuống, cho dù modifier khác phím được nhấn hay không, sử dụng phím này:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... }