Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.034 c
2-1173069183
Углук
2007-03-05 07:33
2007.03.25
Пример DLL


2-1172731737
Abcdef123
2007-03-01 09:48
2007.03.25
SQL запрос


10-1130505467
Volodya_
2005-10-28 17:17
2007.03.25
WebBrowser


2-1173076282
Grover
2007-03-05 09:31
2007.03.25
Передача данных между приложениями.


15-1172172456
Cyrax
2007-02-22 22:27
2007.03.25
Дружественные методы и классы в C#





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский