2015-04-30 3 views
2

У меня есть следующий обработчик события для NotifyIcon внутри приложения WPF с помощью интеграции форм:NotifyIcon MouseDown MouseEventArgs нет данных о местоположении

void MyNotifyIcon_MouseDown(Object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    ShowSettingsWindow(); 
} 

Однако e.Location = {X=0,Y=0} всегда. Есть ли способ сделать эту работу?

Update

Как ни странно, люди проголосовали, чтобы закрыть этот вопрос и downvoted его. Однако его явно не работает и достаточно просто, чтобы создать новый файл NotifyIcon внутри файла App.xaml.cs приложения WPF и попробовать его для себя.

Update

Как Ганс указывал, это дизайн. Он все еще не отвечает на вопрос, какие возможные обходные пути. Кроме того, это плохой дизайн, потому что:

  1. Это событие происходит на MouseDown, что означает, что он должен иметь некоторый контекст положения курсора мыши, когда она была нажата для того, чтобы произошло. Обработчик WmMouseDown для NotifyIcon имеет свойство ref Message mwhich other controls use to establish the correct position, однако, похоже, оно игнорирует это свойство и не использует его в обработчике событий. Я бы назвал это основной ошибкой.

  2. С момента своего вскрытия, получение Cursor.Position внутри MouseDown не даст вам точного последнего местоположения, в котором MouseDown был поднят после щелчка по иконке в трее. Существует небольшая задержка между нажатием на нее, и она поднимает событие, в котором вы можете перемещать мышь. Вы можете проверить это самостоятельно с помощью приложения, которое получает координаты мыши, быстро перемещая мышь после нажатия на лоток и получая его местоположение в обработчике MouseDown. Обходной путь (который отвечает на мой вопрос) заключается в том, чтобы сохранить последнее местоположение на каждом MouseMove, используя вместо этого Cursor.Position, и используя это последнее место на MouseDown в качестве места, которое нажало на значок. Все это указывает на явную потребность в местоположении мыши, когда произошло событие.

Видимо, я единственный, кто заботится об этих несоответствиях в .NET в то время как многие люди, кажется, терпеть их или не понимают их последствия должным образом.

+2

Это полностью [дизайн] (http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/NotifyIcon. CS, 7942e6855936067a). –

+0

@ HansPassant Плохой дизайн. – Alexandru

+0

Конечно, это не так, положение мыши бессмысленно, когда значок может случайно изменить позицию в любой момент. –

ответ

0

Его не идеально, потому что framework is designed to not send proper mouse event arguments, как Ганс указывал, но один обходной путь, чтобы сохранить последнее место на каждом MouseMove используя Cursor.Position и с помощью этого последнего места на MouseDown как место, что контекстуально щелкнул значок.

0

Рассматривали ли вы установку глобального крючка мыши? Он обходит типичную модель событий WPF, и вам придется вручную определять координаты. Это может быть связано с дополнительными вызовами API.

Подробности можно найти в этом посте Global mouse event handler

Смежные вопросы