2009-06-10 5 views
33

В моем приложении C# я хочу отобразить контекстное меню, но я хочу добавить специальные опции в меню, если клавиша SHIFT удерживается, когда контекст открывается меню.C# - Обнаружение, если клавиша SHIFT удерживается при открытии контекстного меню

В настоящее время я использую API GetKeyState, чтобы проверить ключ SHIFT. Он отлично работает на моем компьютере, но пользователи с неанглийскими Windows говорят, что они вообще не работают для них.

Я также прочитал, что в API Win32 при открытии контекстного меню есть флаг, который указывает, что в меню должно отображаться 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 на управлении, чтобы определить, удерживается ли клавиша сдвига.

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

Это переименование стиля флага, хотя в зависимости от ситуации вы можете захотеть провести более тщательное тестирование.

Также обратите внимание, что это проверит, будет ли удерживаться клавиша Shift в момент проверки значения. Не тот момент, когда было открыто меню. Это не может быть существенной разницей для вашего приложения, но это стоит отметить.

+0

к сожалению, родители Контекстные в моем коде является UserControl и свойство ModifierKeys не доступно ни для UserContr ol или для объекта ContextMenu. –

+0

@ Крис - Как говорит Джаред, это статично. Я обновил его ответ ссылкой на msdn –

+0

Я этого не заметил. Я думал, что это свойство экземпляра. Я проверю это. –

37

Используется для обнаружения, если клавиша переключения нажата:

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

К тому времени, как я набрал этот ответ, Джаред уже разместил его. Извините за дубликат. – bobbyalex

+0

Крис прав. Свойство должно быть доступно вам, даже если вы используете UserControl. – bobbyalex

+11

Это проверяет, нажата ли клавиша Shift, чего хочет исходный вопрос. Другой ответ проверяет, ТОЛЬКО нажата клавиша Shift. – adzm

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) 
{ ... } 
Смежные вопросы