Текущий архив: 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.45 MB
Время: 0.006 c