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

Вниз

LowLevel mouse hook и "зависание" окна   Найти похожие ветки 

 
LonelyWolf   (2008-09-18 10:50) [0]

Есть задача отлавливать поворот колесика мышки. Прога пишется с использовнием только WinAPI.
Повесил хук WH_MOUSE_LL, разместил его процедуры в DLL. Все работает отлично, но есть одна очень неприятная проблема: когда жму любую системную кнопочку окна программы (свернуть, развернуть, закрыть) ровно на пять секунд мышка замирает, а потом окно делает требуемое действие (например закрывается).

Почитал в MSDN что:
The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:
HKEY_CURRENT_USER\Control Panel\Desktop
The value is in milliseconds. If the hook procedure does not return during this interval, the system will pass the message to the next hook.

Т.е. процедура должна отработать хук в течение времени, указанного в этом ключе реестра и если этого не произойдет, система передаст сообщение следующему хуку. В этой ветке как раз 5 секунд и указаны.

Вопрос: почему замирает мышка?

Пока решил вопрос так: при вызове окна настроек снимаю хук, а при закрытии окна вешаю обратно. Но нужно чтобы хук работал все время.

Если вызвать несколько окошек, то закрываются они нормально кроме последнего, которое замирает на 5 секунд.

ЗЫ: вариант отлова WM_GETMESSAGE пробовал. С ним этой проблемы нет, но он не всегда ловит прокрутку колеса мышки, например когда активно консольное окно...

ЗЗЫ: что еще уточнить, не знаю - говорите :)


 
Сергей М. ©   (2008-09-18 12:24) [1]


> хук WH_MOUSE_LL, разместил его процедуры в DLL


За каким лешим оно понадобилось именно в DLL ? С этого начнем ..


> почему замирает мышка?


Потому что у тебя ошибка в программе.


 
LonelyWolf   (2008-09-18 12:29) [2]

Не знаю как тут темы удалять...

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

Сделал постановку хука в отдельном потоке со своим обработчиком сообщений. Решилась и проблема с кнопочками и некоторым подтормаживанием мышки при повышенной нагрузке на саму прогу...


 
LonelyWolf   (2008-09-18 12:34) [3]


> За каким лешим оно понадобилось именно в DLL ? С этого начнем
> ..

Ну до этого хук был не LowLevel, его требовалось в DLL пихать. Я читал что для этого хука нет необходимости в DLL. Итого назрел второй вопрос: чем плохо то, что этот хук в DLL лежит?


 
Сергей М. ©   (2008-09-18 13:00) [4]


> чем плохо то, что этот хук в DLL лежит?
>


DLL сама по себе зло.
И использовать ее нужно только там, где она действительно необходима или без нее не обойтись.


 
LonelyWolf   (2008-09-18 13:19) [5]


> DLL сама по себе зло.

Исчерпывающее объяснение :)

Перекинул функции из DLL в саму прогу. Размер экзешника вырос на 1кб, а гемор с подгрузкой DLL исчез и сама DLL размером 7.5кб тоже исчезла. Удобно. Имеем экономию 6.5кб (!)


 
Сергей М. ©   (2008-09-18 14:54) [6]


> Имеем экономию 6.5кб (!)


Малацца)
Экзамен по "экономии" сдал, но работу по специальности ты вряд ли найдешь - в наше время терабайтных носителей 64-х ОС ловцы блох типа тебя не востребованы)


 
Городской Шаман   (2008-09-21 09:12) [7]


> LonelyWolf   (18.09.08 10:50)


Ну еще что нужно знать, то что в 64-битной версии windows твой хук будет работать только в 32-х разрядных процессах.

И вообще почитай это - чем глобальный хук отличается от локального и зачем нужна dll для глобального.

Ну и вот это вот интересно:
However, the WH_MOUSE_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.


 
Городской Шаман   (2008-09-21 09:16) [8]

В общем для WH_MOUSE_LL глобальный хук ставится без всяких dll.



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

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

Наверх





Память: 0.46 MB
Время: 0.004 c
2-1254207790
GlowSolnce
2009-09-29 11:03
2009.11.15
Приведение типов


2-1254333632
Vorotnyak_nazar
2009-09-30 22:00
2009.11.15
где в Delphi 7 компонент TrotateImage


2-1254222520
FIL-23
2009-09-29 15:08
2009.11.15
Перетаскиваени объектов


15-1253369312
Игорь
2009-09-19 18:08
2009.11.15
APM


15-1253166116
Andy BitOff
2009-09-17 09:41
2009.11.15
Работа с .pdf





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