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

Вниз

Почему слетает 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 вся ветка

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

Наверх




Память: 0.45 MB
Время: 0.004 c
1-39727
BlackGrin
2002-04-27 15:02
2002.05.13
Программное задание переменных


14-39850
VictorT
2002-04-04 11:04
2002.05.13
Задачка


1-39802
Lagutin Anton
2002-04-28 04:30
2002.05.13
Как очистить папку Temp


6-39820
Piriken
2002-02-22 18:14
2002.05.13
Правка HTML-документа


4-39884
Woolen
2002-03-09 14:54
2002.05.13
Определение завершения работы Windows





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