Аннотация:
При создании пользовательского интерфейса иногда требуется определить момент, когда курсор мыши выходит за пределы окна. Для решения этой задачи существуют различные методы. Можно воспользоваться готовой функцией TrackMouseEvent, которая появилась в Win32 API, начиная с Windows 98/NT4, или же эквивалентной ей функцией _TrackMouseEvent из библиотеки comctl32.dll. А можно добиться требуемого поведения "вручную", использую стандартные средства.
// заряжаем вдогонку WM_MOUSEHOVER
// если мышку двинули до того, как всплыло сообщение
// произойдет перезарядка (обнуление таймера)
tme.dwFlags = TME_HOVER;
// время срабатывания по умолчанию, вообще задается в миллисекундах
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
Конечно лажовые способы использование таймера и прочей чепухи
намного лучше написать стандартную функцию
типа InitExMouseMessages() в длл
где
1. создается хук на WndProc на все потоки в системе
2. в этом хуке помня обрабатывается только сообщение MouseMove
3. соответсвенно смотря входящий хэндл окна и сравнивая его с переменной типа hOldWnd отсылать PostMessage(hOldWnd, WM_MOUSELEAVE, 0, 0) и hOldWnd = hWnd вот собственно и все
весь код пишется за минут 10, главное не забыть что hOldWnd это переменная которая расшаривается между процессами для этого соответсвенно нужно написать небольшой кодик
в функции инициализации длл
вот и все
зато спосо будет работать на всех окнах в системе
Ничем:) но я говорил про другое
про способ когда мы делаем все сами
да и ктому же этот спсоб не требует вызовов TrackMouseEvent запалонения структур
и прочего что отнимает процессорное и программисткое время
мой способ действует на верняка и на все окна системы
в общем то я думаю что это лучше
Но есть и недостатки.
1. Необходимость отдельной DLL
2. Нужно писать больше кода. Как ни крутись, там его будет больше. Да и ошибаются программисты в глобальных хуках очень и очень часто.
3. Нестандартно. Функция _TrackMouseEvent входит в Windows, используется IE и другими программами и с гарантией будет работать всегда и везде. А в своей функции можно случайно допустить ошибку и расхлёбывать потом. В конце концов, другая программа может засадить свой собственный хук и "забыть" вызвать по цепочке твой. Доказывай потом юзеру, что нефиг ставить такие программы. ;)
4. Ну и по поводу производительности. Структуру заполнять не надо и вызывать функцию не надо — это плюс. Но кто сказал, что глобальный хук не вносит задержки (теперь уже глобальной)? Ведь через него пропускаются все мышиные сообщения в системе... DLL мапится в пространства каждого процесса, который работает с мышью...
В общем, всё не так однозначно. Но твой способ также имеет право на существование. Так что если оформишь его в виде законченного кода с пояснениями, можно будет расширить эту статью. Лично я только "за".
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
АША>Авторы: АША> Alexander Shargin АША> Gambler
АША>Аннотация: АША>При создании пользовательского интерфейса иногда требуется определить момент, когда курсор мыши выходит за пределы окна. Для решения этой задачи существуют различные методы. Можно воспользоваться готовой функцией TrackMouseEvent, которая появилась в Win32 API, начиная с Windows 98/NT4, или же эквивалентной ей функцией _TrackMouseEvent из библиотеки comctl32.dll. А можно добиться требуемого поведения "вручную", использую стандартные средства.
Заметил небольшую неточность написанного Вами обработчика WM_MOUSEMOVE. Если необходимо ловить WM_MOUSEHOVER, то оно никогда не придёт, потому что каждый повторный вызов _TrackMouseEvent при обработке MOUSEMOVE будет "сбрасывать" время задержки курсора на 0. Для решения этой проблеммы можно ввести логическую переменную, которую устанавливать в TRUE при первом вызове WM_MOUSEMOVE (после чего вызвать _TrackMouseEvent), а при обработке WM_MOUSELEAVE устанавливать её в FALSE.
Re: Конечно лажовые способы
От:
Аноним
Дата:
11.02.07 04:02
Оценка:
ЕД>зато спосо будет работать на всех окнах в системе
кроме консольны