Search code examples
wpfwindows-7system-tray

System Tray Popup Windows 7 Style


I want something like this:

Tray popup
(source: cybernetnews.com)

This window is not resizable, and aligns itself above the system tray icon which it is related to.

I have this:

Tray popup

Which is resizeable, and it goes wherever it feels like. If you click the volume control in Win 7, it always pops up directly above the icon. This is ideal.

I've found this reference which I think is trying to solve the same problem (can't tell though as the images are dead),

but I'm using WPF and I'm not sure how to get these Form objects they refer to from my Window object. This is the XAML declaration of my window at the moment:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="WirelessControl.Window1"
x:Name="Window"
Title="Window1"
Width="260" Height="370" mc:Ignorable="d" WindowStyle="None"></Window>

I feel like based on how common this is in Windows that there must be a fairly easy way to do this.

ResizeMode="NoResize" causes my window border to disappear, so that's no help.

Thanks guys, I hope I was comprehensive enough.


Solution

  • You can use Shell_NotifyIconGetRect to retrieve the location of the notification icon. You can then reposition your window to match that location. That's what the volume control UI does. Unfortunately it only works on Win7.

    If you need to work on older OS's, you can get the mouse cursor position at the time of the NIN_BALLOONSHOW message - that's what the volume control UI used to do.