Конференция "WinAPI" » LowLevel mouse hook и "зависание" окна [D7, WinXP]
 
  • LonelyWolf (18.09.08 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 пробовал. С ним этой проблемы нет, но он не всегда ловит прокрутку колеса мышки, например когда активно консольное окно...

    ЗЗЫ: что еще уточнить, не знаю - говорите :)
  • Сергей М. © (18.09.08 12:24) [1]

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


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


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


    Потому что у тебя ошибка в программе.
  • LonelyWolf (18.09.08 12:29) [2]
    Не знаю как тут темы удалять...

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

    Сделал постановку хука в отдельном потоке со своим обработчиком сообщений. Решилась и проблема с кнопочками и некоторым подтормаживанием мышки при повышенной нагрузке на саму прогу...
  • LonelyWolf (18.09.08 12:34) [3]

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

    Ну до этого хук был не LowLevel, его требовалось в DLL пихать. Я читал что для этого хука нет необходимости в DLL. Итого назрел второй вопрос: чем плохо то, что этот хук в DLL лежит?
  • Сергей М. © (18.09.08 13:00) [4]

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


    DLL сама по себе зло.
    И использовать ее нужно только там, где она действительно необходима или без нее не обойтись.
  • LonelyWolf (18.09.08 13:19) [5]

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

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

    Перекинул функции из DLL в саму прогу. Размер экзешника вырос на 1кб, а гемор с подгрузкой DLL исчез и сама DLL размером 7.5кб тоже исчезла. Удобно. Имеем экономию 6.5кб (!)
  • Сергей М. © (18.09.08 14:54) [6]

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


    Малацца)
    Экзамен по "экономии" сдал, но работу по специальности ты вряд ли найдешь - в наше время терабайтных носителей 64-х ОС ловцы блох типа тебя не востребованы)
  • Городской Шаман (21.09.08 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.
  • Городской Шаман (21.09.08 09:16) [8]
    В общем для WH_MOUSE_LL глобальный хук ставится без всяких dll.
 
Конференция "WinAPI" » LowLevel mouse hook и "зависание" окна [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0]