Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2012, 18:42   #1
NithrouS
Новичок
Джуниор
 
Регистрация: 15.10.2011
Сообщений: 1
По умолчанию Почему обработчик нажатия клавиши не видит PrintScreen? (C#)

При создании формы подписался на keyEventHandler(myFunction), почему если в функции myFunction ввести проверку на вводимые символы(e.KeyCode == Keys.D) все работает, за исключением если вместо Keys.D вставить Keys.PrintScreen.

private void myFunction(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.D)
MessageBox.Show(«123»);
}

При нажатии на клавишу D и любые клавиши кроме PrintScreen — вылазит месседжбокс. Вот с принтскрином не прокатывает — что делать?
Пардон, пост кинул не совсем в ту категорию

Последний раз редактировалось NithrouS; 19.07.2012 в 18:49.
NithrouS вне форума Ответить с цитированием
Старый 23.07.2012, 20:31   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

В свойствах формы необходимо выставить параметр KeyPreview = true
затем создать обработчик KeyUp(...) в котором вставить обработку кнопки PrintScreen.

Если все таки необходимо сделать на KeyDown, тогда придется использовать низкоуровненвый перехватчик сообщений. Hook в простонародье.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.07.2012, 18:08   #3
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

Код:
        public Form1()
        {
            InitializeComponent();

            KeyPreview = true;
            this.KeyUp += (sender, e) => { if (e.KeyCode == Keys.PrintScreen) MessageBox.Show(e.KeyValue.ToString()); };
            
        }
Правда у всех своя, а истину не знает ни кто.
@SSV вне форума Ответить с цитированием
Старый 29.07.2012, 21:30   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от @SSV Посмотреть сообщение
Код:
        public Form1()
        {
            InitializeComponent();

            KeyPreview = true;
            this.KeyUp += (sender, e) => { if (e.KeyCode == Keys.PrintScreen) MessageBox.Show(e.KeyValue.ToString()); };
            
        }
Лямбда выражения не рекомендуется применять поскольку они усложняют чтение кода, а также после компиляции превращаются в достаточно сложные структуры которые могут притормозить исполнение кода. Также лямбда выражения невозможно отлаживать "налету".

Так что данном случае данная структура крайне нелогична.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.07.2012, 21:39   #5
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Лямбда выражения не рекомендуется применять поскольку они усложняют чтение кода, а также после компиляции превращаются в достаточно сложные структуры которые могут притормозить исполнение кода. Также лямбда выражения невозможно отлаживать "налету".

Так что данном случае данная структура крайне нелогична.
Ну откажись тогда от Linq и делай все в циклах. Его тоже налету сложно отладить.
Я просто показал один из возможных вариантов.
Правда у всех своя, а истину не знает ни кто.
@SSV вне форума Ответить с цитированием
Старый 29.07.2012, 21:44   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от @SSV Посмотреть сообщение
Ну откажись тогда от Linq и делай все в циклах. Его тоже налету сложно отладить.
Я просто показал один из возможных вариантов.
ТС сделал MessageBox только для проверки ... а если функция обработки будет больше?? строк этак в 100 ... тоже в лямбду пихать?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.07.2012, 21:55   #7
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
ТС сделал MessageBox только для проверки ... а если функция обработки будет больше?? строк этак в 100 ... тоже в лямбду пихать?
Без проблем. Но лучше конечно сделать это отдельным методом, а в обработчике события вызвать его. Например вот так:
Код:
       public Form1()
        {
            InitializeComponent();

            KeyPreview = true;
            this.KeyUp += (sender, e) => { if (e.KeyCode == Keys.PrintScreen) {myfunc(); /*можем здесь еще что-нибудь написать*/}/*и здесь тоже*/};
        }

       void myfunc()
        {
            //пишем все, что угодно
        }
Правда у всех своя, а истину не знает ни кто.

Последний раз редактировалось @SSV; 29.07.2012 в 21:58.
@SSV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик нажатия кнопки в Qt optimator Qt и кроссплатформенное программирование С/С++ 6 30.11.2011 23:11
Как обработать обработчик клавиши UP? casio23 Общие вопросы Delphi 9 08.02.2011 21:12
обработчик событий нажатия кнопки legendary HTML и CSS 1 06.01.2011 19:28
Обработчик нажатия кнопки OlegII Помощь студентам 4 08.12.2010 16:24
почему не работает процедура нажатия клавиши в делфи buka_14 Помощь студентам 3 16.04.2009 17:26