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

Вниз

Почему слетает HOOK на клавиатуру!?   Найти похожие ветки 

 
Ray ©   (2002-03-12 14:03) [0]

НИчего не пойму. Создал .dll на Си с процедурой. Сажаю глобальный хзук на клавиатуру через Delphi. И что получается, если активна моя программа то хук пашет. Если к примеру переключаюсь в FAR Manager хук по прежнему пашет, но если переключаюсь в любое GUI прилождение то хук слетает так что больше вообще не пашет! 8(. Все написано правильно вроде. Вот процедурка из .dll
LRESULT CALLBACK KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam )
{
BOOL fDiscard = FALSE;
if ( nCode >= 0 )
{
fDiscard=MyProgramProc(wParam,lParam);
if (!fDiscard)
{
return( CallNextHookEx(hhookKeyboardHook, nCode, wParam, lParam) );
} else
{
return( fDiscard );
}

};
return( CallNextHookEx(hhookKeyboardHook, nCode, wParam, lParam) );
}
Она вызывает мою процеруду, адрес которой был передан ранее при загрузке .dll.
Вот обработка ее в Delphi

function MyProc;
begin
if key=vk_up then
begin
Form1.Label1.caption:=inttostr(random(100));
result:=true;
end else result:=false;
end;
------
Че то я не вьеду что делаю не так????


 
Ray ©   (2002-03-12 14:12) [1]

Вопрос отпал, сделал hook.dll на Дельфи и вроде все пашет. Но вот почему не пахало на C++? Не знаю :(


 
Виктор Щербаков ©   (2002-03-12 14:24) [2]


> сделал hook.dll на Дельфи и вроде все пашет.

Не может быть! Ты же пытаешься вызвать процедуру, которая в общем случае находится в другом адресном пространстве. Поэтому последствия могут быть непредсказуемыми.

Обычно из хука отправляют сообщение в окно программы, поставившей хук. А хэндл этого окна берется из проецируемого в память файла, который нужно создать (и поместить туда хэндл) непосредственно перед загрузкой dll с хуком. В проецируемый файл следует поместить и переменную hhookKeyboardHook.


 
Fellomena   (2002-03-12 15:45) [3]

Действительно презабавно получается... Судя по коду function MyProc; будет выполняться только в контексте процесса, поставившего хук, т.е. в его адресном пространстве.
Что бы работало то, что хочет автор, надо, как сказал Виктор, сохранять в Mapped файле дескриптор главного окна, регестрировать свой тип сообщения, которое затем будет послано главному приложению из dll, находящейся в АП процесса, загрузившего её, вот.

В проецируемый файл следует поместить и переменную hhookKeyboardHook.

Это критично, когда несколько приложений ставят хук одного и того же типа.
Но делать это, безусловно надо.



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

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

Наверх




Память: 0.47 MB
Время: 0.012 c
4-39909
SerVS - S
2002-03-12 17:10
2002.05.13
HOOKs


1-39693
Riko
2002-04-29 14:58
2002.05.13
Как применить?


3-39646
KirilAlex
2002-04-16 20:53
2002.05.13
Фильтрация по условию из подчиненой.


1-39732
Андрей Сенченко
2002-04-27 15:18
2002.05.13
Регистрация горячей клавиши


4-39895
skywalker
2002-03-06 17:48
2002.05.13
И снова потоки...