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

Вниз

SendMessage() отправляет два сообщения   Найти похожие ветки 

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

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

программа ловит нажатия клавишь (хук из 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 другая, как определить какое событие именно произошло?


 
VID ©   (2002-06-23 01:36) [1]


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


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


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

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

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


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

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

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

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


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

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


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

Все, понял. У Вас ошибка в коде, поэтому и два сообщения ловятся - одно 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-24 19:17) [6]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
3-95704
Sim0n
2002-08-08 08:54
2002.08.29
помогите разобраться с DBGrid


1-95817
Cr@sh
2002-08-19 07:55
2002.08.29
Выручите с построением линии.


1-95792
Riko
2002-08-19 17:39
2002.08.29
Очистки кеша


3-95714
Влад Утюмов
2002-08-08 18:52
2002.08.29
Время отклика Refresh растет при перемещении в конец датасета


1-95879
DaDe
2002-08-18 13:29
2002.08.29
Компанент Edit c иконкой ???