How to dynamically show/hide the Taskbar application button

An issue is to implement the show/hide taskbar application button from within the window-application in Microsoft Visual C++ environment using MFC. Hiding the taskbar can be accomplished by ITaskbarList COM interface which requires necessary COM-handling overhead. Unfortunately, this interface is provided by Shell32.dll version 4.71 (and higher) only. Normally, there is not even a standard header in Microsoft Visual C++ 6.0 supporting this feature. Although the full source code is obtainable in Microsoft MSDN Source Library, the idea was to implement this feature as simple as possible just using the standard WINDOWS functions.

Showing/hiding taskbar buttons normally work in conjunction with registering an application icon in the system tray (adding or removing an icon to the system tray is equally described on other pages).

There is no big problem to implement visual behavior of taskbar buttons while creating the main application window. It does just to set an invisible Popup or Overlapped window as the parent window of the main application window (generally derived from CFrameWnd) in it's PreCreateWindow() virtual method. This solution is well-known and well documented. But how to restore the visibility of the hidden taskbar button again in runtime. Let's figure out:

First Step:

Create the modeless invisible dialog using resource dialog with ID e.g. IDD_FRAMEOWNER (empty dialog with no borders):

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
    if (!CFrameWnd::PreCreateWindow(cs)) return FALSE; 
    if (!m_bOwnerCreated) // "dialog-is-created" flag 
    { 
        // m_MainFrameOwner - CDialog object mapped to the resource dialog template 
        m_bOwnerCreated = m_MainFrameOwner.Create(IDD_FRAMEOWNER); 
        if (m_bOwnerCreated) m_MainFrameOwner.ShowWindow(SW_HIDE); 
    }; 

    // set the dialog as a parent of CMainFrame window 
    if (m_bOwnerCreated) 
    cs.hwndParent = m_MainFrameOwner.GetSafeHwnd(); 

    return TRUE; 
} 

Last Step

Define the method like this:

BOOL CMainFrame::ShowTaskBarButton(BOOL bVisible) 
{ 
    if (!m_bOwnerCreated) return FALSE; 

    ShowWindow(SW_HIDE);

    if (bVisible) 
        ModifyStyleEx(0, WS_EX_APPWINDOW); 
    else 
        ModifyStyleEx(WS_EX_APPWINDOW, 0);

    ShowWindow(SW_SHOW);

    return TRUE; 
} 

When we need to show the taskbar button that was previously hidden we have to modify the CMainFrame window ex-style by adding WS_EX_APPWINDOW flag. This flag suppresses the behavior of the owner window and the application itself becomes visible (from the taskbar point of view).

On the other hand removing WS_EX_APPWINDOW flag forces the taskbar to find the owner window relying to the CMainFrame window - which is invisible and the button gets disappeared. Using ShowWindow() method is needed to make the necessary refreshing of the taskbar itself after changing the CMainFrame window ex-style.