C # - Обнаружение, если клавиша SHIFT удерживается при открытии контекстного меню - PullRequest
34 голосов
/ 10 июня 2009

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

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

Я также читал, что в 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?

Ответы [ 5 ]

65 голосов
/ 10 июня 2009

Вы можете использовать статическое свойство ModifierKeys для элемента управления, чтобы определить, удерживается ли клавиша Shift.

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

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

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

38 голосов
/ 10 июня 2009

Используйте это, чтобы определить, нажата ли клавиша Shift:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
14 голосов
/ 28 февраля 2014

Это на самом деле намного проще, чем что-либо из этого

            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

3 голосов
/ 14 июня 2017

Keyboard.Modifiers также работает с реальными проектами WPF!
Также я бы порекомендовал использовать более Keyboard.GetKeyStates, поскольку последний использует триггер и может не отражать реальное состояние ключа.

Также имейте в виду, что это сработает ТОЛЬКО, если клавиша-модификатор shift нажата и ничего больше:

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

Если вы просто хотите определить, нажата ли клавиша shift , нажата ли другая клавиша-модификатор, используйте эту:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
3 голосов
/ 25 октября 2013

В Silverlight, по крайней мере, в последних версиях, вы должны использовать:

if(Keyboard.Modifiers == ModifierKeys.Shift) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...