С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/78: Рейтинг темы: голосов - 78, средняя оценка - 4.79
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124

Несколько событий KeyDown

18.06.2011, 15:37. Показов 15869. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Нужно на форме сделать два события KeyDown, которые будут срабатывать на нажатия только определенных клавиш (в разных потоках). Как вообще выглядит метод, вызывающий KeyDown, и как вручную определить такое событие?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2011, 15:37
Ответы с готовыми решениями:

Как объединить в одном методе несколько событий
Добрый день! Подскажите, пожалуйста, как объединить в одном методе несколько событий, вот код private void button1_Click(object sender,...

Несколько обработчиков событий
Ситуация следующая, имеется несколько обработчиков различных событий, когда события зажгутся не известно. Есть новый метод, логику...

Создание обработчика на несколько событий
Надеюсья верно выразился, т.к. сам только вчера начал изучать все это дело.. Короче есть такой код: ...

11
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
18.06.2011, 15:48
Цитата Сообщение от somethingrotten Посмотреть сообщение
Добрый день. Нужно на форме сделать два события KeyDown, которые будут срабатывать на нажатия только определенных клавиш (в разных потоках). Как вообще выглядит метод, вызывающий KeyDown, и как вручную определить такое событие?
Вот пример кода обработки событий текстового редактора Ctrl+N Ctrl+O Ctrl+S Ctrl+T
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
       private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control)
            {
                Keys key = e.KeyData;
                key &= ~Keys.Control;
                string kc = key.ToString();
                if (kc == "N") { clearText(); return; }
                if (kc == "O") { Open();      return; }
                if (kc == "S") { Save();      return; }
                if (kc == "T") { transFromBuf(); }
            }
        }
2
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
18.06.2011, 15:53
chessman1, Может у тебя есть пример, перехвата нажатия клавишь, при активной форме... только без альта и конта...
По моему автор это имел ввиду...
1
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
18.06.2011, 15:57  [ТС]
Спасибо, но не совсем то. Здесь условие в обработчике, а мне нужно, чтобы обработчик вообще не запускался до нажатия определенной клавиши. Это ведь можно сделать, если не ошибаюсь, как-нибудь так:

C#
1
2
3
4
5
public event EventHandler<KeyEventArgs> KeyDownEvent;
public void KeyPressed(char key) {
KeyEventArgs k=new KeyEventArgs();
if (KeyDownEvent!=null&&k.KeyValue=='s') KeyDownEvent(this, k);
}
Но как это написать для собственно кейдауна?
__________
Или может, есть проще способ: по сути, мне надо, чтобы два человека могли одновременно играть на одной форме с разными клавишами-стрелками. Если сделать стандартный обработчик KeyDown, то нажатия клавиш будут поступать в него по очереди - а мне нужно, чтобы в одно и то же время, т.е. у каждого игрока был бы свой обработчик клавиш.
0
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
18.06.2011, 16:03
дак вызывай KeyPressed в
C#
1
private void Form1_KeyDown(object sender, KeyEventArgs e)
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
18.06.2011, 16:17  [ТС]
Еще раз: главный вопрос не в том, как поставить условие, а в том, как сделать два события. Т.е. к стандартному Control.KeyDown мне нужно объявить руками еще одно Control.AnotherKeyDown, так вот - как?
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
18.06.2011, 16:18
Цитата Сообщение от xWinDx Посмотреть сообщение
chessman1, Может у тебя есть пример, перехвата нажатия клавишь, при активной форме... только без альта и конта...
По моему автор это имел ввиду...
C#
1
2
3
4
5
6
this.KeyUp += new KeyEventHandler(OnKeyUp);
// ...
public void OnKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show(e.KeyCode.ToString(), "KeyPressed");
}
1
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
18.06.2011, 16:22
Цитата Сообщение от chessman1 Посмотреть сообщение
C#
1
2
3
4
5
6
this.KeyUp += new KeyEventHandler(OnKeyUp);
// ...
public void OnKeyUp(object sender, KeyEventArgs e)
{
    MessageBox.Show(e.KeyCode.ToString(), "KeyPressed");
}
Так то не работает... тыкау все клавиши не одна не проходит
0
60 / 60 / 13
Регистрация: 23.04.2011
Сообщений: 110
18.06.2011, 18:24
Цитата Сообщение от somethingrotten Посмотреть сообщение
Еще раз: главный вопрос не в том, как поставить условие, а в том, как сделать два события. Т.е. к стандартному Control.KeyDown мне нужно объявить руками еще одно Control.AnotherKeyDown, так вот - как?
событие KeyDown одно для формы и всегда происходит независимо от того какая клавиша была нажата - на этом этапе никакого контроля, нажали ли вы "1", "2" или "Ctrl+q", не происходит, выполняются те методы, на которые this.KeyDown подписано. Уже в методах ваш код решает, что именно надо выполнять на основе анализа нажатых клавиш.
вот так:
Цитата Сообщение от chessman1 Посмотреть сообщение
Вот пример кода обработки событий текстового редактора Ctrl+N Ctrl+O Ctrl+S Ctrl+T
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
       private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control)
            {
                Keys key = e.KeyData;
                key &= ~Keys.Control;
                string kc = key.ToString();
                if (kc == "N") { clearText(); return; }
                if (kc == "O") { Open();      return; }
                if (kc == "S") { Save();      return; }
                if (kc == "T") { transFromBuf(); }
            }
        }
Если вам надо вызвать два обработчика при нажатии какой-либо клавиши на форме, то следует просто добавить два обработчика для KeyDown:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public Form1()
        {
            InitializeComponent();
            this.KeyDown += new KeyEventHandler(onKeyDown1);
            this.KeyDown += new KeyEventHandler(onKeyDown2);
        }
 
        private void onKeyDown1(object sender, KeyEventArgs e)
        {            
            MessageBox.Show("KeyDown1");
            //здесь можно запустить нечто во вторичном потоке
            //затем выполнится onKeyDown2 и параллельно будет выполняться код во втором потоке
        }
 
        private void onKeyDown2(object sender, KeyEventArgs e)
        {
            MessageBox.Show("KeyDown2");
        }
2
95 / 95 / 15
Регистрация: 11.11.2010
Сообщений: 424
18.06.2011, 18:35
Цитата Сообщение от xWinDx Посмотреть сообщение
Так то не работает... тыкау все клавиши не одна не проходит
Рискну предположить, не работает ввиду того, что форма просто не имеет фокус.
0
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
18.06.2011, 18:49
Цитата Сообщение от Guliash Посмотреть сообщение
Рискну предположить, не работает ввиду того, что форма просто не имеет фокус.
нет, я уже и программно отдал ей фокус... всё равно не работает... блин... сне это не сильно надо, но прям интересно почему не ловит начатие клавиш...
У кого ещё варианты есть?

Добавлено через 5 минут
Во всех остальных компанентах нормально реагирует...

Добавлено через 2 минуты
C#
1
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Component_KeyUp);
C#
1
2
3
4
  private void Component_KeyUp(object sender, KeyEventArgs e)
        {     
            MessageBox.Show("KeyPressed");
        }
Может я, что-нибудь не так написал?
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
18.06.2011, 19:13  [ТС]
windzzor, спасибо, это и хотел узнать. Проблему решил другим способом, энивей, но все равно любопытно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2011, 19:13
Помогаю со студенческими работами здесь

Повесить несколько событий
Есть один елемент с id=&quot;img1&quot;?б при нажатии на него к нему добавляется border с одним цветом и при еще одном нажати на него же без...

Несколько обработчиков событий
Народ ток начитаю, сильно ругайте, в общем у меня в есть 3 кнопки, для 1, по инструкции создал обработчик событий, но там не было...

Несколько событий onload
добрый день всем. Помогите рачку с такой проблемой. Один сайт использует iframe'ы, ajax и т.д. Возможно ли как то отловить...

Один код на несколько событий
Как написать код один раз для нескольких событий одного компонента или разных компонентов?

Несколько событий на одной кнопке
Можно ли повесить несколько событий на одну кнопку, например: button1_click и button2_click


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru