Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработка нажатия клавиши, обработка delete 
:(
    Опции темы
Artiom
Дата 26.9.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



какая-то мистика - не обрабатывается кнопка Delete!
Все остальные работают - а она нет
Код

protected override void OnKeyPress(KeyPressEventArgs e)
{
switch((Keys)e.KeyChar)
            {
              case Keys.D0:
              case Keys.D1:
              case Keys.D2:
              case Keys.D3:
              case Keys.D4:
              case Keys.D5:
              case Keys.D6:
              case Keys.D7:
              case Keys.D8:
              case Keys.D9:
              case Keys.Space:
                e.Handled = false;
                break;
              case Keys.Back:
                e.Handled = true;
                SetNull(1);
                break;
              case Keys.Delete:
                e.Handled = true;
                SetNull(2);
                break;
               default:
                e.Handled = true;
                break;
            }
            base.OnKeyPress (e);
}

даже не попадаю в в ветку case Keys.Delete! В чем грабли?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
mr.DUDA
Дата 26.9.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



У меня тоже какие-то непонятки всегда с несимвольными клавишами... smile


--------------------
user posted image
PM MAIL WWW   Вверх
Gazon
Дата 26.9.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 9.1.2005

Репутация: 3
Всего: 8



Цитата
Все остальные работают - а она нет

все остальные работают, потому что эта вирт. ф-ия работает с символьными клавишами.
Для перехвата нажатия delete отвечай на событие KeyDown или KeyUp.

хороший пример по обработки нажатия клавишь и установки глобального хука.
http://www.codeproject.com/csharp/globalhook.asp
--------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться.
PM MAIL   Вверх
mr.DUDA
Дата 26.9.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Всё равно George Mamaladze не даёт ответа на животрепещущий вопрос: как правильно перехватывать клавиши из своего (чужого) контрола - по какому событию (KeyUp/KeyDown/KeyPress), и по каким свойствам event handler'ов (благо там есть выбор из KeyCode, KeyChar и т.п.) ? smile


--------------------
user posted image
PM MAIL WWW   Вверх
-ser-
Дата 27.9.2005, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



если контрол например текстбокс, то просто
Код

private void textBox1_KeyDown( object sender, KeyEventArgs e ) 
{ 
     if( e.KeyCode == Keys.Delete ) 
     { 
        e.Handled=true; 
     } 
}



a если, например, юзер контрол, то через ProcessDialogKey. вот вам для Delete:

Код

        protected override bool ProcessDialogKey( Keys keyData )
        {
            switch( keyData )
            {
                case Keys.Delete:
                    MessageBox.Show( "Delete" );
                    break;
                default:
                    break;
            }
            return base.ProcessDialogKey( keyData );
        }


и, как говорит mr.DUDA, будет вам счастье.



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

Код

        public override bool PreProcessMessage( ref Message msg ) 
        {
            Keys keyData = ( ( Keys )( int )msg.WParam );
            
            if ( keyData == Keys.Delete )
            {
                MessageBox.Show( "It's me again!" );
            }
            return false;
        }


Это сообщение отредактировал(а) -ser- - 27.9.2005, 07:08


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Artiom
Дата 27.9.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Сделал так
Код

public override bool PreProcessMessage( ref Message msg )
            {
            
                Keys keyData = (Keys)(int)msg.WParam;    
                switch(keyData){    
                  case Keys.D0:
                case Keys.D1:
                case Keys.D2:
                case Keys.D3:
                case Keys.D4:
                case Keys.D5:
                case Keys.D6:
                case Keys.D7:
                case Keys.D8:
                case Keys.D9:
                       //HandDigit(keyData);
                       return true;
                сase Keys.Escape:
                       Application.Exit();
                       return true;
                сase Keys.Back:
                        SetNull(1);
                        return true;
                 case Keys.Space:
                   HandSpace();
                        return true;
                сase Keys.Delete:
                        SetNull(2);
                         return true;    
                 default:
                         return false;
               }
       }


Почему-то каждая ветка case выполняется 2 раза! В чем дело?

Это сообщение отредактировал(а) Artiom - 27.9.2005, 09:47


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.9.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Artiom @ 27.9.2005, 09:40)
Почему-то каждая ветка case выполняется 2 раза! В чем дело?

Первый - нажатие, второй - отпускание клавиши.


--------------------
user posted image
PM MAIL WWW   Вверх
Artiom
Дата 27.9.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Понятно, поставил if (msg.MSG==WM_KEYDOWN) и все заработало


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Artiom
Дата 27.9.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



и еще вопрос, при такой реализации почему-то работают только те кноки, которые я обрабатываю вручную. Как сделать так чтобы, например, кнопка Tab работала по дефолту?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.9.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Нужно вызывать base.PreProcessMessage.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.3433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.