Главная страница
    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.45 MB
Время: 0.006 c
3-95695
sdram
2002-08-08 16:29
2002.08.29
Как добавить запись с пустыми полями?


1-95850
Viacheslav
2002-08-17 22:17
2002.08.29
.rc-файлы (файлы ресурсов)


1-95761
CrazyHackers
2002-08-19 13:47
2002.08.29
Изменять порядок элементов treeview


1-95786
AL2002
2002-08-19 20:06
2002.08.29
Вариантов много. Функции две


1-95741
Александр
2002-08-18 14:31
2002.08.29
ListView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский