Запретить нажатие клавиши
Реализация: с помощью ApplicationEvents.
Помогите разобраться как это сделать.
Я мыслю так: ставим обработчик OnMessage, анализируем Msg.message. Если оно == wm_KeyDown и Msg.wParam == 46...
То что? :confused:
Любое перехваченное тобой сообщение является методом-прокси. После того как ты его перехватил ты обязан отправить это сообщение дальше по цепочке. Так вот, если ты не отправишь его по цепочке дальше, то и события как бы и небыло и текст не удалиться.
Цитата: SABROG
Любое перехваченное тобой сообщение является методом-прокси. После того как ты его перехватил ты обязан отправить это сообщение дальше по цепочке. Так вот, если ты не отправишь его по цепочке дальше, то и события как бы и небыло и текст не удалиться.
Теоретически да....
Но если я обрабатываю это сообщение практически - оно уходит дальше само собой. Как его не пускать дальше?
Зависит от твоего кода. Иногда достаточно возвратить true или false, иногда надо не вызывать DefWindowProc.
Цитата: SABROG
Зависит от твоего кода. Иногда достаточно возвратить true или false, иногда надо не вызывать DefWindowProc.
А можешь код написать?
Начало, Triaffer, у тебя правильно написано. Вобщем если нажата действительно нужная тебе кнопка, то делай
Код:
Handled=true;
И все. И оно не пройдет дальше этого обработчика.
Цитата: Borgir
Что вы человеку голову забиваете? Написано же было в вопросе что надо реализовывать с помощью ApplicationEvents.
Начало, Triaffer, у тебя правильно написано. Вобщем если нажата действительно нужная тебе кнопка, то делай
И все. И оно не пройдет дальше этого обработчика.
Начало, Triaffer, у тебя правильно написано. Вобщем если нажата действительно нужная тебе кнопка, то делай
Код:
Handled=true;
И все. И оно не пройдет дальше этого обработчика.
Ну значит и тему надо для студентов перенести. Обычно никто себя в методах не ограничивает из разработчиков...
Цитата: SABROG
Ну значит и тему надо для студентов перенести. Обычно никто себя в методах не ограничивает из разработчиков...
Не надо меня никуда переносить - мне удобно было бы сделать именно так, потому что все обработчики у меня обрабатываются именно с помощью ApplicationEvents.
to Borgir:
Не получается с помощью Handled=true :(
Цитата:
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.
Пишут, что должно работать... А еще пишут, что тысячи сообщений в секунду врятли понравится твоей программе.
Всем спасибо, я нашел решение.
Дело в том, что событие нажатия кнопки надо было обрабатывать не по WM_KEYDOWN, а WM_KEYUP - вполне логично производить действие ПОСЛЕ нажатия кнопки.
Вот результат:
if (Msg.message == WM_KEYUP)
{
if (Msg.wParam == 46)
{
Handled = true;
}
}
Код:
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if (
Msg.message == WM_KEYDOWN &&
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE) Handled = true;
}
bool &Handled)
{
if (
Msg.message == WM_KEYDOWN &&
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE) Handled = true;
}
Но я бы все-равно не советовал использовать такой метод перехвата нажатия клавиш. У тебя этот эвент будет вызывать на каждое движение мыши, каждую перерисовку контролов, причем чем их будет больше, тем больше нагрузка. Подобный метод хорош только для отладки.
Да нормальный способ, вы че. Не так уж часто пользователи нажимаю кнопки клавиатуры. Это же не текстовый редактор.
Цитата: Borgir
Да нормальный способ, вы че. Не так уж часто пользователи нажимаю кнопки клавиатуры. Это же не текстовый редактор.
Но мыша то они дергают постоянно...
А причем тут мышка, если там обрабатываются нажатия клавиш клавиатуры?
Код:
if (Msg.message == WM_KEYDOWN &&
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE)
Msg.hwnd == Edit1->Handle &&
Msg.wParam == VK_DELETE)
Я бы лично перебрал все контролы на форме с классами, где не хочу обрабатывать кнопку Delete и переопределил их WindowProc функцию на свою, где в конце бы вызывал оригинальную. Можно например создать свой класс, где ввести переменную "оригинальный WndProc" и метод обработки. Создавать экземпляр класса для каждого контрола, заполнять переменную и устанавливать новый обработчик - метод класса.
Код:
Edit1->WindowProc = MyMessageHandler;