Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 и ставьте!


Наверх

Титульная страница Поиск, карта сайта Написать письмо