Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

KeyPreview   Найти похожие ветки 

 
Kealon ©   (2006-03-20 07:18) [0]

Как правильно перехватить нажатие клавиши?
Здесь был похожий вопрос

http://delphimaster.net/view/11-1123695011/

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, как побороть!!!???


 
ECM ©   (2006-03-20 16:28) [1]


> перехватываю нажатие клавиши на EditBox
> (onKeyPress или onKeyUp)
> и Key делаю равным 0, но символ всё равно вводится в Edit,
>  как побороть!!!???

А какой в этом смысл, если всё-равно приходит событие OnChar
вот там Key := #0 и ставьте!


 
Kealon ©   (2006-03-21 06:28) [2]

в том то и дело что мне нужно перехватить нажатие клавиш всей формы, просто активным у меня всё время оказывается 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]

КАК ОТСЛЕДИТЬ НАЖАТИЕ КЛАВИШ НА ЛЮБОМ КОНТРОЛЕ, НЕ ЗНАЯ САМИХ КОНТРОЛОВ ИЗ ГЛАВНОЙ ФОРМЫ И БЛОКИРОВАТЬ ЧАСТЬ НАЖАТИЙ???


 
Kealon ©   (2006-03-21 11:12) [3]

Кроме того не перехватываются часть системных сочетаний, которые в VCL глотаются на ура F10, Alt+F4
с этим как бороться?
а проверять их надо


 
Vladimir Kladov   (2006-03-21 19:24) [4]

OnMessage ловит все. Надо смотреть WM_KEYDOWN. Если нужен WM_char, то надо еще смотреть WM_SYSchar, тогда ловятся системные клавиши (Alt).


 
Kealon ©   (2006-03-22 15:19) [5]

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-22 16:55) [6]

Все прекрасно ловится, именно этим кодом. Но KeyPreview надо включать:

Form.KeyPreview := TRUE; + опция KEY_PREVIEW в проекте.


 
Kealon ©   (2006-03-23 06:21) [7]

Не ловится у формы, :(
хотя
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-23 15:22) [8]

Да тот же. = WM_CHAR) or (... = WM_SYSHAR только. Апплет не используется. Если есть Applet, возможно - ловить надо в его OnMessage.


 
Kealon ©   (2006-03-23 17:15) [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;


как быть? :(


 
Kealon ©   (2006-03-23 17:15) [10]

Апплет стоит,
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 18:50) [11]

F10 ловится на
(Msg.message=WM_SYSCOMMAND) and (Msg.wParam=SC_KEYMENU)

а WM_SYSCHAR не ловится даже у активного контрола

труба какая то просто


 
Vladimir Kladov   (2006-03-23 22:28) [12]

Ну конечно, F10, Alt+F4... Вы может еще Ctrl+Alt+Del отловить захочете? Под приходом WM_SYSHAR я понимаю Alt+"S" например. Бывает нужда (например, в эмуляторе) ловить все клавиши (эмулирую "чужую" клавиатуру и не давая системе перехватить инициативу). Тогда приходится от WM_CHAR отказываться (и наоборот, подавлять его, на случай, если он все-таки придет), а работать только с WM_KEYDOWN+WM_SYSKEYDOWN и WM_KEYUP+WM_SYSKEYUP. Так я делал, работает очень хорошо.


 
Kealon ©   (2006-03-24 20:46) [13]

F10, Alt+F4 действительно нужно ловить, старая версия программы написанная под VCL это делала

Программа использует настройку горячих клавиш от пользователя и F10 например использовалась,каждая такая кнопка на счету, а Ctrl+Alt+Del ни к чему, а Alt+F4 за компанию приплюсовалась, что бы не нажать случайно, на неё пустой хоткей стоял

http://clanskitalec.narod.ru/other.htm


 
Kealon ©   (2006-03-27 14:12) [14]

Наконец то написал первый релиз, выложил
mudclient.narod.ru
Проблема с перехватом Alt+F4 и F10 так и осталась


 
[e]Bu$ter ©   (2006-06-24 15:52) [15]

Скажите пожалуйста, что нужно сделать для того, чтоб можно было установить
Form.KeyPreview := TRUE;
?

У моей FORMы вообще такого свойства нет :(


 
ECM ©   (2006-06-24 16:00) [16]

> У моей FORMы вообще такого свойства нет

Добавьте в опции проекта ( Conditional Defines)
KEY_PREVIEW
И пересоберите проект... Оно появится :)
И вообще пройдитесь поиском в KOL.PAS по этому поводу - и посмотрите, почитайте...


 
[e]Bu$ter ©   (2006-06-24 16:10) [17]


> И пересоберите проект... Оно появится :)

Добавить то я добавил, а вот пересобрать я не догадался.
Спасибо, заработало.



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
8-1153917194
BadTester
2006-07-26 16:33
2007.03.25
Как из Image сделать полноценную кнопку?


2-1172678346
dzhagr
2007-02-28 18:59
2007.03.25
FastReport


15-1172747108
Vlad Oshin
2007-03-01 14:05
2007.03.25
Как осуществляется вывод cgi в окно браузера? Механизм интересует


15-1172519518
Юрий_К
2007-02-26 22:51
2007.03.25
Real and integer


15-1172581034
Rare
2007-02-27 15:57
2007.03.25
Что такое поиск в ширину в фазовом пространстве?