2009-07-27 4 views
0

Я пытаюсь показать всплывающее меню при щелчке правой кнопкой мыши по значку уведомления, который отлично работает; Но я хочу, чтобы меню исчезало, когда пользователь щелкает за пределами этого меню.Контекстное меню значка «Tray» (NotifyIcon) Delphi не исчезает при нажатии на него

Это, предположительно, дизайн (согласно этому документу: http://support.microsoft.com/kb/135788), но нет приличного приложения, которое я знаю о том, как ведет себя. Я попытался вызвать SetForegroundWindow, используя дескриптор всплывающего меню, но безрезультатно. Я уверен, что можно обойти это, как я это делал много лет назад, но не помню, как это сделать.

Кто-нибудь знает, как достичь ожидаемого поведения?

ответ

0

Я нашел решение!

Я звонил SetForegroundWindow (PopupMenu1.Handle);

Который не работает, но изменить это в обработчик событий OnPopup для

procedure TForm1.PopupMenu1Popup(Sender: TObject); 
begin 
    // Hack to fix the "by design" behaviour of popups from notification area icons. 
    // See: http://support.microsoft.com/kb/135788 
    BringToFront(); 
end; 

Works!

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

Мне было бы интересно узнать, есть ли способ заставить меню работать прямо без перескакивания окна.

+1

Причина, по которой ваш вызов 'SetForegroundWindow' не работает, заключается в том, что вы указываете его * меню * дескриптор вместо дескриптора * окна *. Они не взаимозаменяемы. Вместо этого вы должны были использовать только 'Handle' (a.k.a.' Self.Handle'). –

+0

Согласовано. Во всех моих приложениях systray я использую SetForegroundWindow(), чтобы сфокусировать TForm перед отображением всплывающего меню. Я также выдаю сообщение WM_NULL в TForm после закрытия всплывающего меню. –

+0

никогда не проверял статус SetForegroundWindow, позволяя ему терпеть неудачу? – OnTheFly

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