2009-06-10 21 views
33

在我的C#應用​​程序中,我想顯示一個上下文菜單,但是我想向菜單添加特殊選項,如果在上下文時按住SHIFT鍵菜單打開。我正在用GetKeyState API檢查SHIFT鍵。它可以在我的電腦上正常工作,但使用非英語Windows的用戶表示完全無法使用它們。C# - 檢測是否在打開上下文菜單時保持SHIFT鍵

我還讀到在Win32 API中打開上下文菜單時,有一個標誌指示菜單中應顯示EXTENDEDVERBS。在C#中,EventArgs對於Opening事件不包含(從我所知道的)屬性指示EXTENDEDVERBS或者是否有任何修飾鍵被按下。

這裏是我現在使用「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); 
} 

如果函數GetKeyState是這樣做的正確的方式,是我的代碼正確檢測到SHIFT鍵被按下?

回答

60

您可以使用控件上的ModifierKeys static property來確定是否正在按住shift鍵。

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

這是一個標誌樣式的枚舉,但取決於你的情況,你可能想要做更嚴格的測試。

另請注意,這將檢查在檢查值時是否保持Shift鍵。不是菜單打開的時刻。這對您的應用程序來說可能不是顯着的差異,但值得注意。

+0

遺憾的是,文本菜單在我的代碼父母是用戶控件和ModifierKeys屬性是不可用時爲UserContr ol或ContextMenu對象。 – 2009-06-10 05:06:58

+0

@Chris - Jared說這是靜態的。我更新了他的答案,並附有msdn – 2009-06-10 05:20:10

37

使用此功能可以檢測,如果按下Shift鍵:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
3

在Silverlight中,至少在最新版本中,您必須使用:

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

它實際上比任何的是更加簡單

  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 */ 
      } 

只要確保您的項目引用了PresentationCore和WindowsBase

2

Keyboard.Modifiers也適用於實際的WPF項目!
此外,我會建議它的使用超過Keyboard.GetKeyStates因爲後來使用觸發,可能不會反映真正的關鍵狀態。

另外要注意,這隻會觸發如果轉變修改鍵是向下,沒有別的:

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

如果你只是想檢測,如果轉變鍵被按下,是否有另一個修改鍵被按下,用這一個:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
相關問題