Как я могу сделать так, чтобы значок на панели задач (области уведомлений) получал сообщения WM_MOUSEWHEEL?

StackOverflow https://stackoverflow.com/questions/90411

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Насколько я знаю, область уведомлений не получает никаких сообщений WM_MOUSEWHEEL, но все же я нашел приложение, которое делает именно то, чего я хочу добиться (http://www.actualsolution.com/power_mixer).Используя WinspectorSpy, я заметил несколько странных сообщений, которые получает форма приложения:0x000003d0 и 0x000003d1, но упоминаний о них я не нашел.

Есть ли у кого-нибудь идеи о том, как я могу достичь желаемой функциональности?

Это было полезно?

Решение

Если вы хотите захватывать события мыши/клавиатуры вне вашего приложения, вам понадобится Хуки низкого уровня.

Хорошая статья для начинающих об установке крючка мыши в Delphi: Как подключить мышь для перехвата событий за пределами вашего приложения на About.com, автор Зарко Гайич.

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

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

Другие советы

Я объяснил о подключении мыши и упомянул, что может быть сложно найти именно ваш значок.Я нашел следующую статью о том, как найти значок в трее.

CTrayIconPosition — где моя иконка в трее? Ирек Зелински.Я думаю, если вы попытаетесь понять, как это работает, вы сможете перевернуть его и использовать, чтобы проверить, находится ли ваша мышь в данный момент над вашим значком.

Но сначала следует проверить, находится ли мышь в области лотка.Я нашел свой старый код (2005 г.), который определяет правильный регион.

var
 hwndTaskBar, hwndTrayWnd, hwndTrayToolBar : HWND;
 rTrayToolBar : tRect;
begin
 hwndTaskBar  := FindWindowEx (0, 0, 'Shell_TrayWnd', nil);
 hwndTrayWnd  := FindWindowEx (hwndTaskBar , 0, 'TrayNotifyWnd',nil);
 hwndTrayToolBar := FindWindowEx(hwndTrayWnd, 0, 'ToolbarWindow32',nil);

 Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar);
end

Я думаю, используя этот фрагмент кода и знания из упомянутой статьи, вы сможете реализовать ту функциональность, которую хотели.

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

Я не знаю, поможет ли это вам, но в Delphi стандартная библиотека сообщений гласит:

WM_MOUSEWHEEL = $020A;

Также было бы полезно, если бы вы сообщили, какой язык вы используете.

Просто решил отметить, что Power Mixer фиксирует события колеса прокрутки на всей панели задач, в то время как средний щелчок мыши действует только на значке на панели задач.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top