Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запретить нажатие клавиши

7.4K
01 марта 2007 года
Triaffer
49 / / 30.07.2006
Имеется задача: сделать так, чтобы при нажатии клавиши del на форме ничего не происходило (не удалялся текст из текстового поля, не удалялись какие-то объекты) - то есть сделать так, чтобы нажатия как будто бы и небыло.
Реализация: с помощью ApplicationEvents.
Помогите разобраться как это сделать.

Я мыслю так: ставим обработчик OnMessage, анализируем Msg.message. Если оно == wm_KeyDown и Msg.wParam == 46...
То что? :confused:
1.9K
01 марта 2007 года
SABROG
242 / / 26.01.2006
Любое перехваченное тобой сообщение является методом-прокси. После того как ты его перехватил ты обязан отправить это сообщение дальше по цепочке. Так вот, если ты не отправишь его по цепочке дальше, то и события как бы и небыло и текст не удалиться.
7.4K
01 марта 2007 года
Triaffer
49 / / 30.07.2006
Цитата: SABROG
Любое перехваченное тобой сообщение является методом-прокси. После того как ты его перехватил ты обязан отправить это сообщение дальше по цепочке. Так вот, если ты не отправишь его по цепочке дальше, то и события как бы и небыло и текст не удалиться.



Теоретически да....
Но если я обрабатываю это сообщение практически - оно уходит дальше само собой. Как его не пускать дальше?

1.9K
01 марта 2007 года
SABROG
242 / / 26.01.2006
Зависит от твоего кода. Иногда достаточно возвратить true или false, иногда надо не вызывать DefWindowProc.
7.4K
01 марта 2007 года
Triaffer
49 / / 30.07.2006
Цитата: SABROG
Зависит от твоего кода. Иногда достаточно возвратить true или false, иногда надо не вызывать DefWindowProc.



А можешь код написать?

9.5K
01 марта 2007 года
Borgir
97 / / 20.12.2006
Что вы человеку голову забиваете? Написано же было в вопросе что надо реализовывать с помощью ApplicationEvents.
Начало, Triaffer, у тебя правильно написано. Вобщем если нажата действительно нужная тебе кнопка, то делай
 
Код:
Handled=true;

И все. И оно не пройдет дальше этого обработчика.
1.9K
01 марта 2007 года
SABROG
242 / / 26.01.2006
Цитата: Borgir
Что вы человеку голову забиваете? Написано же было в вопросе что надо реализовывать с помощью ApplicationEvents.
Начало, Triaffer, у тебя правильно написано. Вобщем если нажата действительно нужная тебе кнопка, то делай
 
Код:
Handled=true;

И все. И оно не пройдет дальше этого обработчика.



Ну значит и тему надо для студентов перенести. Обычно никто себя в методах не ограничивает из разработчиков...

7.4K
01 марта 2007 года
Triaffer
49 / / 30.07.2006
Цитата: SABROG
Ну значит и тему надо для студентов перенести. Обычно никто себя в методах не ограничивает из разработчиков...



Не надо меня никуда переносить - мне удобно было бы сделать именно так, потому что все обработчики у меня обрабатываются именно с помощью ApplicationEvents.

to Borgir:
Не получается с помощью Handled=true :(

1.9K
01 марта 2007 года
SABROG
242 / / 26.01.2006
Цитата:

Use OnMessage to trap any or all Windows messages posted to all windows in the application. OnMessage occurs when an application receives a Windows message. OnMessage only receives messages that are posted to the message queue, not those sent directly with the Windows API SendMessage function.

An OnMessage event handler allows an application to respond to messages other than those declared in the events for TApplication. If the application doesn't have a specific handler for an incoming message, the message is dispatched to the window for which it was intended, and Windows handles the message.

The Msg parameter identifies the Windows message, and the Handled parameter indicates whether the event handler responded to the message. Set Handled to True if the message has been completely handled, to prevent subsequent processing of the message.



Пишут, что должно работать... А еще пишут, что тысячи сообщений в секунду врятли понравится твоей программе.

7.4K
01 марта 2007 года
Triaffer
49 / / 30.07.2006
ТЕМА ЗАКРЫТА!

Всем спасибо, я нашел решение.

Дело в том, что событие нажатия кнопки надо было обрабатывать не по WM_KEYDOWN, а WM_KEYUP - вполне логично производить действие ПОСЛЕ нажатия кнопки.
Вот результат:

if (Msg.message == WM_KEYUP)
{
if (Msg.wParam == 46)
{
Handled = true;
}
}
1.9K
01 марта 2007 года
SABROG
242 / / 26.01.2006
У меня и с WM_KEYDOWN работает, правда может это только с Editoм работает :)

 
Код:
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
if (
Msg.message == WM_KEYDOWN &&
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE) Handled = true;
}


Но я бы все-равно не советовал использовать такой метод перехвата нажатия клавиш. У тебя этот эвент будет вызывать на каждое движение мыши, каждую перерисовку контролов, причем чем их будет больше, тем больше нагрузка. Подобный метод хорош только для отладки.
9.5K
01 марта 2007 года
Borgir
97 / / 20.12.2006
Да нормальный способ, вы че. Не так уж часто пользователи нажимаю кнопки клавиатуры. Это же не текстовый редактор.
1.9K
02 марта 2007 года
SABROG
242 / / 26.01.2006
Цитата: Borgir
Да нормальный способ, вы че. Не так уж часто пользователи нажимаю кнопки клавиатуры. Это же не текстовый редактор.



Но мыша то они дергают постоянно...

9.5K
02 марта 2007 года
Borgir
97 / / 20.12.2006
А причем тут мышка, если там обрабатываются нажатия клавиш клавиатуры?
1.9K
02 марта 2007 года
SABROG
242 / / 26.01.2006
У тебя этот блок будет выполняться на любое сообщение, именно в нем выцепляется сообщение о событии в клавиатуре:

 
Код:
if (Msg.message == WM_KEYDOWN &&
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE)


Я бы лично перебрал все контролы на форме с классами, где не хочу обрабатывать кнопку Delete и переопределил их WindowProc функцию на свою, где в конце бы вызывал оригинальную. Можно например создать свой класс, где ввести переменную "оригинальный WndProc" и метод обработки. Создавать экземпляр класса для каждого контрола, заполнять переменную и устанавливать новый обработчик - метод класса.

 
Код:
Edit1->WindowProc = MyMessageHandler;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог