С# - Обнаружение, если удерживать клавишу SHIFT при открытии контекстного меню
В моем приложении С# я хочу отобразить контекстное меню, но я хочу добавить специальные опции в меню, если клавиша SHIFT удерживается при открытии контекстного меню.
В настоящее время я использую API GetKeyState
для проверки ключа SHIFT. Он отлично работает на моем компьютере, но пользователи с неанглийскими Windows говорят, что они вообще не работают для них.
Я также прочитал, что в API Win32 при открытии контекстного меню флаг, который указывает в меню, должен показывать EXTENDEDVERBS
. В С# 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?
Ответы
Ответ 1
Вы можете использовать статическое свойство ModifierKeys для управления, чтобы определить, удерживается ли клавиша shift.
if (Control.ModifierKeys == Keys.Shift ) {
...
}
Это переименование стиля флага, хотя в зависимости от вашей ситуации вы можете захотеть провести более тщательное тестирование.
Также обратите внимание, что это проверит, будет ли удерживаться клавиша Shift в момент проверки значения. Не тот момент, когда было открыто меню. Это не может быть существенной разницей для вашего приложения, но это стоит отметить.
Ответ 2
Используйте это, чтобы определить, нажата ли клавиша смены:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
Ответ 3
На самом деле это намного проще, чем любой из этих
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
Ответ 4
В Silverlight, по крайней мере в последних версиях, вы должны использовать:
if(Keyboard.Modifiers == ModifierKeys.Shift) {
...
}
Ответ 5
Keyboard.Modifiers
также работает с реальными проектами WPF!
Также я бы рекомендовал использовать более Keyboard.GetKeyStates
, потому что позже использует запуск и может не отражать состояние реального ключа.
Также имейте в виду, что это будет срабатывать ТОЛЬКО, если клавиша-модификатор shift отсутствует и ничего больше:
if(Keyboard.Modifiers == ModifierKeys.Shift)
{ ... }
Если вы просто хотите определить, нажата ли клавиша shift, нажата ли другая клавиша-модификатор или нет, используйте следующую команду:
if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }