Главная страница
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.011 c
3-95659
Natalishka
2002-08-07 13:26
2002.08.29
Народ помогите!!


7-95989
elgato
2002-06-19 11:10
2002.08.29
System Message


8-95912
som
2002-04-22 13:33
2002.08.29
PCX - файлы...


1-95852
snoup
2002-08-17 22:00
2002.08.29
Как сделать чтобы в мемо определенный текст был например красного


1-95863
Artem_V
2002-08-18 08:40
2002.08.29
Курсоры