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

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

SendMessage() отправляет два сообщения


Новенький в Делфи ©   (2002-06-23 00:34:00) 

или что-то другое.

программа ловит нажатия клавишь (хук из dll устанавливается), после чего отправляется сообщение, которое ловит процедура в программе, и выводит в memo отловленную клавишу, но почему-то в memo выводится эта клавиша два раза подряд.

---DLL----

Function KeybProc(code: integer; wParam: word; lParam: longInt):longInt; stdcall;
var AppWnd: HWND;
begin
if code<0 then
begin
Result:=CallNextHookEx(Global.SysHook,code,wParam,lParam);
exit;
end;
if (lParam and KF_UP)=0 then
begin
AppWnd:= GetForegroundWindow();
SendMessage(Global.MyWin, WM_KEYHOOK, wParam,AppWnd);
end;
Result:=CallNextHookEx(Global.SysHook,code,wParam,lParam);
end;


---UNIT1---

procedure TForm1.WndProc(var msg: TMessage);
begin
inherited;
if msg.Msg = WM_KEYHOOK then
begin
try
Keys:= String(chr(msg.WParam));
memo1.Lines.Add(Keys);
Keys:="";
except end;
end;
end;


попутно вопрос, мне нужно что бы на KeyDown сробатывала одна процедура а на KeyUp другая, как определить какое событие именно произошло?


Новенький в Делфи   (2002-06-24 19:17:00) [1]

Юрий Зотов - благодарю! Всё получилось! :)


Юрий Зотов   (2002-06-24 00:34:00) [2]

Все, понял. У Вас ошибка в коде, поэтому и два сообщения ловятся - одно DOWN, второе UP. WM_CHAR здесь ни при чем.

if (lParam and KF_UP) = 0 then ... - это ошибка.

KF_UP имеет значение $8000. Поэтому надо брать не весь lParam, а его старшее слово (см. описание WM_KEYDOWN/UP), иначе Вы проверяете не 31-й бит, а 15-й. А еще проще сразу проверять 31-й бит - он же знаковый. Кстати, оно и быстрее выполняется.

if lParam < 0
then ... // это UP
else ... // это DOWN


Новенький в Делфи   (2002-06-23 23:05:00) [3]

а как отловить тогда что именно произошло? WM_KEYDOWN; WM_KEYUP ?


Юрий Зотов   (2002-06-23 07:57:00) [4]

> когда она не в фокусе, клавиши не ловятся..

Не вняли Вы моему совету, не прочитали статью Алексея Павлова. А зря. Не ловятся чужие клавиши, и ловиться не будут, пока Вы не сделаете данные действительно глобальными. См. сюда:
http://delphi.mastak.ru/articles/hooks/index.html

А выводится дважды, похоже, потому, что символьные клавиши генерят два сообшения - сначала WM_KEYDOWN(UP), а потом WM_CHAR. Там же TranslateMessage в цикле выборки работает.


Новенький в Делфи   (2002-06-23 02:42:00) [5]

..смысл в том что бы программа ловила эти нажатия не только когда она в фокусе...

:(( тут ещё одна проблема оказалась... когда она не в фокусе, клавиши не ловятся..


VID   (2002-06-23 01:36:00) [6]


> попутно вопрос, мне нужно что бы на KeyDown сробатывала
> одна процедура а на KeyUp другая, как определить какое событие
> именно произошло?


наверное я всё-таки чего-то понял :) Однако, почему бы просто не обрабатывть соотв события (onKeyUp и onKeyDown) формы ?


Наверх

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