У NotifyIcon есть эквивалент MouseDown? - PullRequest
6 голосов
/ 01 марта 2012

У меня есть NotifyIcon в системном трее. Как я могу определить, когда пользователь щелкнул левой кнопкой мыши? Я предполагал, что событие MouseDown будет тем, что я хочу использовать, но оно обрабатывает только щелчок правой кнопкой мыши и нажатие средней кнопки. Для щелчка левой кнопкой мыши, он срабатывает только после того, как пользователь отпустил (как если бы он только что выполнил обычный щелчок). Есть ли способ получить только событие MouseDown?

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

По замыслу оболочка синтезирует сообщение MouseDown из события up. Вы поймете, почему это работает так, когда вы нажмете и удержите кнопку, а затем начнете перетаскивать. Обратите внимание, что всплывающее окно области уведомлений всплывает и позволяет перетащить значок в него, чтобы удалить его из видимой области. Это не может работать в обоих направлениях.

Технически, вы можете подключить окно, принадлежащее Explorer.exe, чтобы получить доступ к сообщениям, прежде чем Explorer сделает это с помощью SetWindowsHookEx (). Однако для этого требуется тип DLL, которую вы не можете записать в C #, ее нужно вставить в Explorer. Очень дестабилизирующе и трудно победить конкурентов, которые пытаются сделать то же самое. Также тот код, который вызывает бессонные ночи для команды разработчиков приложений Microsoft.

3 голосов
/ 04 марта 2012

Похоже, что базовый Win32 API Shell_NotifyIcon отправляет сообщение WM_LBUTTONDOWN, когда пользователь нажимает значок . Согласно MSDN в любом случае.

Изучение исходного кода Windows Forms для NotifyIcon показывает стандартную обработку событий нажатия мыши, поэтому, если сообщение Win32 отправлялось в «правильное» время, оно будет работать так, как вы хотите / ожидаете.

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

Возможно, эта статья о создании иконки в трее для WPF будет полезна, поскольку в ней показано, как использовать SetWindowsHookEx и т. Д. Из C #.

...