/// <summary> /// Creates the taskbar icon. This message is invoked during initialization, /// if the taskbar is restarted, and whenever the icon is displayed. /// </summary> private void CreateTaskbarIcon() { lock (lockObject) { if (IsTaskbarIconCreated) { return; } const IconDataMembers members = IconDataMembers.Message | IconDataMembers.Icon | IconDataMembers.Tip; //write initial configuration var status = Util.WriteIconData(ref iconData, NotifyCommand.Add, members); if (!status) { // couldn't create the icon - we can assume this is because explorer is not running (yet!) // -> try a bit later again rather than throwing an exception. Typically, if the windows // shell is being loaded later, this method is being re-invoked from OnTaskbarCreated // (we could also retry after a delay, but that's currently YAGNI) return; } //set to most recent version SetVersion(); messageSink.Version = (NotifyIconVersion)iconData.VersionOrTimeout; IsTaskbarIconCreated = true; } }
/// <summary> /// Sets tooltip settings for the class depending on defined /// dependency properties and OS support. /// </summary> private void WriteToolTipSettings() { const IconDataMembers flags = IconDataMembers.Tip; iconData.ToolTipText = ToolTipText; if (messageSink.Version == NotifyIconVersion.Vista) { // we need to set a tooltip text to get tooltip events from the // taskbar icon if (string.IsNullOrEmpty(iconData.ToolTipText) && TrayToolTipResolved != null) { // if we have not tooltip text but a custom tooltip, we // need to set a dummy value (we're displaying the ToolTip control, not the string) iconData.ToolTipText = "ToolTip"; } } // update the tooltip text Util.WriteIconData(ref iconData, NotifyCommand.Modify, flags); }
/// <summary> /// Updates the taskbar icons with data provided by a given /// <see cref="NotifyIconData"/> instance. /// </summary> /// <param name="data">Configuration settings for the NotifyIcon.</param> /// <param name="command">Operation on the icon (e.g. delete the icon).</param> /// <param name="flags">Defines which members of the <paramref name="data"/> /// structure are set.</param> /// <returns>True if the data was successfully written.</returns> /// <remarks>See Shell_NotifyIcon documentation on MSDN for details.</remarks> public static bool WriteIconData(ref NotifyIconData data, NotifyCommand command, IconDataMembers flags) { //do nothing if in design mode if (IsDesignMode) { return(true); } data.ValidMembers = flags; lock (SyncRoot) { return(WinApi.Shell_NotifyIcon(command, ref data)); } }