2009-07-27 7 views
0

J'essaie d'afficher un menu contextuel lorsque vous cliquez droit sur mon icône de notification, qui fonctionne bien; Mais je veux que le menu disparaisse lorsque l'utilisateur clique en dehors de ce menu.Delphi "Tray" icône (NotifyIcon) menu contextuel ne disparaît pas lorsque vous cliquez à l'extérieur

Il est censé être de conception (comme dans ce document: http://support.microsoft.com/kb/135788), mais aucune application décente je sais de se comporte comme ça. J'ai essayé d'appeler SetForegroundWindow en utilisant la poignée du menu contextuel en vain. Je suis sûr qu'il est possible de contourner ce problème, comme je l'ai fait il y a des années, mais je ne me souviens plus comment.

Quelqu'un sait comment atteindre le comportement attendu?

Répondre

0

J'ai trouvé une solution! J'appelais SetForegroundWindow (PopupMenu1.Handle);

Ce qui ne fonctionne pas, mais en changeant ce dans le gestionnaire d'événements 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! De toute évidence, si le formulaire est visible lorsque cela est appelé, votre application va sauter en premier, mais si elle est cachée (comme le mien), alors ça va fonctionner.

Je serais intéressé de savoir s'il existe un moyen de faire en sorte que le menu fonctionne correctement sans que la fenêtre ne saute avant tout.

+1

La raison pour laquelle votre appel 'SetForegroundWindow' n'a pas fonctionné est que vous lui donniez un handle * menu * au lieu d'un handle * window *. Ils ne sont pas interchangeables. Vous devriez avoir juste utilisé 'Handle' (a.k.a.' Self.Handle') à la place. –

+0

D'accord. Dans toutes mes applications systray, j'utilise SetForegroundWindow() pour focaliser le TForm avant d'afficher le menu contextuel. J'émets également un message WM_NULL au TForm après la fermeture du menu contextuel. –

+0

n'a jamais vérifié le statut de SetForegroundWindow, lui permettant d'échouer silencieusement? – OnTheFly

Questions connexes