Подтвердить что ты не робот

С# - Обнаружение, если удерживать клавишу 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?

4b9b3361

Ответ 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)
{ ... }