![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KeyPreview [Delphi]
Kealon © (2006-03-20 07:18:00)Как правильно перехватить нажатие клавиши?
Здесь был похожий вопрос
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1123695011&n=10
function TForm1.DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
Result:=false;
if (msg.message = WM_KEYUP) then begin
result:=true;
// сюда вообще не попадает
end;
...
самое интересное например перехватываю нажатие клавиши на EditBox
(onKeyPress или onKeyUp)
и Key делаю равным 0, но символ всё равно вводится в Edit, как побороть!!!???
[e]Bu$ter (2006-06-24 16:10:00) [1]
> И пересоберите проект... Оно появится :)
Добавить то я добавил, а вот пересобрать я не догадался.
Спасибо, заработало.
ECM (2006-06-24 16:00:00) [2]> У моей FORMы вообще такого свойства нет
Добавьте в опции проекта ( Conditional Defines)
KEY_PREVIEW
И пересоберите проект... Оно появится :)
И вообще пройдитесь поиском в KOL.PAS по этому поводу - и посмотрите, почитайте...
[e]Bu$ter (2006-06-24 15:52:00) [3]Скажите пожалуйста, что нужно сделать для того, чтоб можно было установить
Form.KeyPreview := TRUE;
?
У моей FORMы вообще такого свойства нет :(
Kealon (2006-03-27 14:12:00) [4]Наконец то написал первый релиз, выложил
mudclient.narod.ru
Проблема с перехватом Alt+F4 и F10 так и осталась
Kealon (2006-03-24 20:46:00) [5]F10, Alt+F4 действительно нужно ловить, старая версия программы написанная под VCL это делала
Программа использует настройку горячих клавиш от пользователя и F10 например использовалась,каждая такая кнопка на счету, а Ctrl+Alt+Del ни к чему, а Alt+F4 за компанию приплюсовалась, что бы не нажать случайно, на неё пустой хоткей стоял
http://clanskitalec.narod.ru/other.htm
Vladimir Kladov (2006-03-23 22:28:00) [6]Ну конечно, F10, Alt+F4... Вы может еще Ctrl+Alt+Del отловить захочете? Под приходом WM_SYSHAR я понимаю Alt+'S' например. Бывает нужда (например, в эмуляторе) ловить все клавиши (эмулирую "чужую" клавиатуру и не давая системе перехватить инициативу). Тогда приходится от WM_CHAR отказываться (и наоборот, подавлять его, на случай, если он все-таки придет), а работать только с WM_KEYDOWN+WM_SYSKEYDOWN и WM_KEYUP+WM_SYSKEYUP. Так я делал, работает очень хорошо.
Kealon (2006-03-23 18:50:00) [7]F10 ловится на
(Msg.message=WM_SYSCOMMAND) and (Msg.wParam=SC_KEYMENU)
а WM_SYSCHAR не ловится даже у активного контрола
труба какая то просто
Kealon (2006-03-23 17:15:00) [8]Апплет стоит,
WM_CHAR приходит на его обработку,а WM_SYSCHAR нет
function THameleonMainForm.KOLApplet1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result:=false;
if (Msg.message=WM_SYSCHAR) then begin
Result:=true;
//это сообщение даже не приходит, F10 и Alt+F4 работает всем на зло
end else
if (Msg.message=WM_CHAR) then begin
Result:=true;
//блокирует все клавиши, даже у модальных диалогов
end;
end;
как быть? :(
Kealon (2006-03-23 17:15:00) [9]Апплет стоит,
WM_CHAR приходит на его обработку,а WM_SYSCHAR нет
function THameleonMainForm.KOLApplet1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result:=false;
if (Msg.message=WM_SYSCHAR) then begin
Result:=true;
//это сообщение даже не приходит, F10 и Alt+F4 работает всем на зло
end else
if (Msg.message=WM_CHAR) then begin
Result:=true;
//блокирует все клавиши, даже у модальных диалогов
end;
end;
как быть? не ловить же у всех контролов, :(
Vladimir Kladov (2006-03-23 15:22:00) [10]Да тот же. = WM_CHAR) or (... = WM_SYSHAR только. Апплет не используется. Если есть Applet, возможно - ловить надо в его OnMessage.
Kealon (2006-03-23 06:21:00) [11]Не ловится у формы, :(
хотя
Form.KeyPreview := TRUE; + опция KEY_PREVIEW в проекте стоят и стояли
function THameleonMainForm.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result:=false;
if (Msg.message=WM_SYSCHAR) then begin
Result:=true;
//вот сюда так и не попадает
end;
end;
а можно ваш пример?
Vladimir Kladov (2006-03-22 16:55:00) [12]Все прекрасно ловится, именно этим кодом. Но KeyPreview надо включать:
Form.KeyPreview := TRUE; + опция KEY_PREVIEW в проекте.
Kealon (2006-03-22 15:19:00) [13]WM_SYSchar - ловиться то оно ловится, но только на активном компоненте,
а как поймать на форме?
KeyPreview:=true
я так полагаю должен пересылать все события от клавиатуры на форму
почему идёт тока WM_KEYDOWN ?
Alt+F4 код 115
function THameleonMainForm.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result:=false;
if (Msg.message=WM_SYSCHAR) then begin
Result:=true;
//вот сюда ни разу не попадает
end;
end;
Vladimir Kladov (2006-03-21 19:24:00) [14]OnMessage ловит все. Надо смотреть WM_KEYDOWN. Если нужен WM_char, то надо еще смотреть WM_SYSchar, тогда ловятся системные клавиши (Alt).
Kealon (2006-03-21 11:12:00) [15]Кроме того не перехватываются часть системных сочетаний, которые в VCL глотаются на ура F10, Alt+F4
с этим как бороться?
а проверять их надо
Kealon (2006-03-21 06:28:00) [16]в том то и дело что мне нужно перехватить нажатие клавиш всей формы, просто активным у меня всё время оказывается EditBox
нашёл дерективу
{$DEFINE KEY_PREVIEW}
и установил form.KewPreview:=true
при этом нажатия перехватываются на форме, но только OnKeyDown,
OnCharи OnKeyUpне ловятся совсем
и если перехватить
function TForm1.DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
Result:=false;
if (msg.message = WM_KEYUP)and(msg.wparam = 101) then begin
result:=true;
{символ 5 на NumLock клавиат.}
end;
end
то в OnKeyDown формы соответственно ничего не приходит
а в OnKeyDown EditBox-а все нажатия доходят и символ появляется в EditBox-е
я полагаю не совсем корректно вызывать обработчик EditBox-а если главная форма его уже обработала
задача то не просто слежение за нажатыми клавишами но и возможность их блокировки, независимо от того какой контрол в данный момент обрабатывает нажатие клавиш
Delphi 7, WinXP SP2
версия KOL
//[VERSION]
****************************************************************
* VERSION 2.30
****************************************************************
//[END OF VERSION]
КАК ОТСЛЕДИТЬ НАЖАТИЕ КЛАВИШ НА ЛЮБОМ КОНТРОЛЕ, НЕ ЗНАЯ САМИХ КОНТРОЛОВ ИЗ ГЛАВНОЙ ФОРМЫ И БЛОКИРОВАТЬ ЧАСТЬ НАЖАТИЙ???
ECM (2006-03-20 16:28:00) [17]
> перехватываю нажатие клавиши на EditBox
> (onKeyPress или onKeyUp)
> и Key делаю равным 0, но символ всё равно вводится в Edit,
> как побороть!!!???
А какой в этом смысл, если всё-равно приходит событие OnChar
вот там Key := #0 и ставьте!