2 / 2 / 3
Регистрация: 19.04.2018
Сообщений: 100
1

Комбинация клавиш

01.08.2020, 18:59. Показов 1978. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пытался сделать реакцию на комбинацию одновременно нажатых кнопок на клавиатуре, но вместо кнопок Ctrl, Shift и т.д. используются кнопки f1, f2, f3... Что бы было так:

Нажимаю комбинацию клавиш f1 + '+' - к некой переменной1 прибавляется 1;
Нажимаю комбинацию клавиш f1 + '-' - от некой переменной1 убавляется 1;
Нажимаю комбинацию клавиш f2 + '+' - к некой переменной2 прибавляется 1;
Нажимаю комбинацию клавиш f2 + '-' - от некой переменной2 убавляется 1
и т.д.

Начнем с того, что не нашел как сделать горячую клавишу с комбинацией трех кнопок, например: Ctrl + k + d. Стандартные Window.KeyDown возвращают последнюю нажатую кнопку, а в ModifierKeys нет нужных мне f-ок. Нашел на другом сайте RoutedUICommand но оно не распознает f-ки в сочетании с другими кнопками (в прикрепленных файлах картинка)

Подскажите как это можно сделать, перерыл не одну страницу поиска но так и не нашел
Миниатюры
Комбинация клавиш   Комбинация клавиш  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2020, 18:59
Ответы с готовыми решениями:

комбинация клавиш
всем привет!) как мне сделать чтобы программа при нажатии комбинации клавиш ctrl+shift из трея...

Комбинация клавиш и открытие нового окна в приложении
Всем доброго времени суток.Подскажите как сделать что бы при нажатии определенных клавиш (Esc,f1,f3...

Проверка - нажата ли комбинация клавиш при DragDrop ?
Здравствуйте! Искал искал в инете способ, но не нашел. Может быть вы подскажете? Ситуация...

Комбинация условий
Привет! Подскажите пожалуйста как комбинировать условия, например: Если А=1 и Б=2 то, Если...

8
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
01.08.2020, 20:33 2
ты не написал, где конкретно надо получить Gesture, в каком участке кода

https://stackoverflow.com/ques... eys-in-wpf
0
2 / 2 / 3
Регистрация: 19.04.2018
Сообщений: 100
02.08.2020, 10:39  [ТС] 3
Цитата Сообщение от proa33 Посмотреть сообщение
https://stackoverflow.com/ques... eys-in-wpf
Взял отсюда MultiInputGesture, но он срабатывает только один раз т.е. нельзя зажать f1 и зажать '+'. В коде реализации ничего такого не нашел, можно это как-то исправить?
0
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
02.08.2020, 12:23 4
это разговор слепого с глухим
покажи весь код, где надо все это.
0
2 / 2 / 3
Регистрация: 19.04.2018
Сообщений: 100
02.08.2020, 12:49  [ТС] 5
Цитата Сообщение от proa33 Посмотреть сообщение
покажи весь код, где надо все это.
У меня нет какого то полурабочего кода, мне надо узнать как это сделать.
Я определил MultiInputGesture в MainWindow.xaml.cs
C#
1
2
3
4
5
6
7
8
9
10
11
        public MainWindow()
        {
            InitializeComponent();
 
            RoutedUICommand ruic = (RoutedUICommand)FindResource("MyCommand");
            ruic.InputGestures.Add(new MultiInputGesture(new KeyGesture[]
            {
                new KeyGesture(Key.F1, ModifierKeys.None, "F1"),
                new KeyGesture(Key.Add, ModifierKeys.None, "+")
            }));
        }
Прописал RoutedUICommand в XAML и привязал метод вызывающийся при нажатии комбинации
XML
1
2
3
4
5
6
    <Window.Resources>
        <RoutedUICommand x:Key="MyCommand" Text="My Command"/>
    </Window.Resources>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource MyCommand}" Executed="MyCommand_Executed"/>
    </Window.CommandBindings>
Оно работает, но не так как ожидалось. Я хочу что бы можно было зажать f1 + '+' и оно изменяло переменную пока я удерживаю сочетание клавиш нажатым, но оно срабатывает только один раз.
Я хочу знать, возможно ли сделать так, как я описал выше.
0
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
02.08.2020, 13:28 6
Лучший ответ Сообщение было отмечено XRou как решение

Решение

XRou, я думаю вам придётся сделать обработчик события KeyDown или PreviewKeyDown и в нём проверять нажатую комбинацию.

Добавлено через 26 минут
Цитата Сообщение от XRou Посмотреть сообщение
Оно работает, но не так как ожидалось. Я хочу что бы можно было зажать f1 + '+' и оно изменяло переменную пока я удерживаю сочетание клавиш нажатым, но оно срабатывает только один раз.
Я хочу знать, возможно ли сделать так, как я описал выше.
Команды не подходят для такой реализации.
1
2 / 2 / 3
Регистрация: 19.04.2018
Сообщений: 100
02.08.2020, 13:39  [ТС] 7
Цитата Сообщение от Элд Хасп Посмотреть сообщение
я думаю вам придётся сделать обработчик события KeyDown или PreviewKeyDown и в нём проверять нажатую комбинацию.
Да, сделал с помощью событий.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.F1:
                    F1Pressed = true;
                    break;
 
                case Key.F2:
                    F2Pressed = true;
                    break;
 
                case Key.F3:
                    F3Pressed = true;
                    break;
            }
 
            if (e.Key == Key.Add || e.Key == Key.OemPlus)
            {
                if (F1Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle1++;
                }
                if (F2Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle2++;
                }
                if (F3Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle3++;
                }
            }
 
            if (e.Key == Key.Subtract || e.Key == Key.OemMinus)
            {
                if (F1Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle1--;
                }
                if (F2Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle2--;
                }
                if (F3Pressed == true)
                {
                    dataContext.ConstructingCommand.Angle3--;
                }
            }
        }
 
        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.F1:
                    F1Pressed = false;
                    break;
 
                case Key.F2:
                    F2Pressed = false;
                    break;
 
                case Key.F3:
                    F3Pressed = false;
                    break;
            }
        }
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Команды не подходят для такой реализации.
- Хотел узнать, есть ли болле правильный способ.
0
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
02.08.2020, 14:09 8
Цитата Сообщение от XRou Посмотреть сообщение
- Хотел узнать, есть ли болле правильный способ.
Обработчики событий.
Если не хотите захламлять Code Behind Окна, то вынесите их в отдельный класс.

Пример: Получить объект из Grid
0
1577 / 583 / 183
Регистрация: 05.12.2015
Сообщений: 935
02.08.2020, 16:48 9
Цитата Сообщение от XRou Посмотреть сообщение
болле правильный способ.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    class MultiGesture : KeyGesture
    {
        public Key key1 { get; set; }
        public Key key2 { get; set; }
        public Key key3 { get; set; }
        bool isloaded = false;       
        List<Key> keylist = new List<Key>();
        List<Key> templist = new List<Key>();        
        public MultiGesture() : base( Key.None ) { }
        public override bool Matches( object targetElement, InputEventArgs e )
        {
            if( !isloaded )
            {
                isloaded = true;
                if( key1 != Key.None ) keylist.Add( key1 );
                if( key2 != Key.None ) keylist.Add( key2 );
                if( key3 != Key.None ) keylist.Add( key3 );
                FrameworkElement host = targetElement as FrameworkElement;
                host.PreviewKeyUp += ( s, e ) => { templist.Remove( e.Key ); };
            }
            if( e is KeyEventArgs param )
            {              
                if( param.IsRepeat ) return false;
                if( keylist.Contains( param.Key ) )                
                    if( !templist.Contains( param.Key ) )
                    {
                        templist.Add( param.Key );
                        if( templist.Count == keylist.Count )
                            return true;             
                    }
            }
            return false;
        }
    }
объявлять надо по-другому
XML
1
2
3
4
5
6
7
8
9
10
    <Window.Resources>
        <RoutedUICommand x:Key="MyCommand" Text="My Command"/>
        <local:MultiGesture x:Key="ges1" key1="F1" key2="Add" key3="NumPad1"/>
    </Window.Resources>
    <Window.CommandBindings>
        <CommandBinding  Command="{StaticResource MyCommand}" Executed="MyCommand_Executed"/>
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Command="{StaticResource MyCommand}" Gesture="{StaticResource ges1}"/>
    </Window.InputBindings>
можно хоть 10 клавиш обработать - добавь key_XX в класс
подробно не тестировал - если будут проблемы опиши подробно с кодом.
1
02.08.2020, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2020, 16:48
Помогаю со студенческими работами здесь

Комбинация Inner join с PIVOT
Помогите пожалуйста новичку скомбинировать Inner join с PIVOT, на выходе хочу получить название...

Комбинация элементов массива
Здравствуйте, имеется массив слов, необходимо сгенерировать все возможные сочетания слов таким...

Button комбинация CTRL+C в TexBox1
Привет коллеги! Есть код на форму, он делает ping при нажатии на кнопки, значение берет с...

Комбинация win+d и разворачивание моего окна
Здравствуйте! Дано: главное окно формы без границ, при запуске развернуто таким образом: ...

Комбинация выбора нескольких CheckBox и его обработка
У меня есть 6 чекбоксов.. Пользователь может поставить хоть во всех, хооть в одном или хоть в 5...

Перебор комбинация от 0000 до 9999 (4 символа , 10 цифр ,10000 комбинаций )
Подскажите способ вывести все возможные варианты комбинаций в textbox , каждая комбинация с новой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru