Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-95793
Андрусь
2002-08-19 18:27
2002.08.29
Вывод диалога после загрузки главного окна


4-96019
LEXaP
2002-06-25 00:17
2002.08.29
Неактивный пункт меню сделать активным


6-95930
idef
2002-06-19 16:10
2002.08.29
ошибка при определении MAC-адреса


1-95883
Brand
2002-08-01 22:45
2002.08.29
Вопросик???


3-95657
restless
2002-08-07 13:21
2002.08.29
Чем Delphi лучше Visual FoxPro.





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