Как сделать, чтобы окно не появлялось на панели задач

Существует по крайней мере два способа решить эту задачу. Оба документированы в базе знаний Микрософт. Первый очень прост в реализации, но подходит не всегда. Второй более универсальный, а его реализация лишь немного труднее.

Способ 1

Всё, что вам нужно сделать - назначить окну при создании стиль WS_EX_TOOLWINDOW. В программе на "чистом" API этот стиль передаётся функции CreateWindowEx.


HWND hWnd = CreateWindowEx
(
    WS_EX_TOOLWINDOW,        // Задаём нужный стиль.
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
);

В MFC аналогичная задача решается переопределением функции PreCreateWindow, в которой и задаётся нужный стиль.


            
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
 
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
 
    ...
 
    cs.dwExStyle |= WS_EX_TOOLWINDOW;
 
    ...
    
    return TRUE;
}

Как уже говорилось, при использовании этого способа возникает одна проблема. Дело в том, что изначально стиль WS_EX_TOOLWINDOW разрабатывался для вспомогательных окон (таких, как плавающие панели инструментов), а не для главного окна приложения. Окна с этим стилем имеют более узкий заголовок, на котором отсутствует иконка приложения и кнопки минимизации/максимизации (рисунок 1). Если вас это не устраивает, придётся использовать другой способ.

 

Способ 2

Как известно, Windows не отображает на панели задач скрытые окна, а также любые дочерние окна скрытых окон. Поэтому второй способ решить поставленную задачу - назначить окну "в родители" невидимое окно. Например:


            
HWND hHiddenWnd = CreateWindow(szWindowClass, "", WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, 0);
    
HWND hWnd = CreateWindow
(
    szWindowClass,
    szTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    hHiddenWnd,
    NULL,
    hInstance,
    NULL
);

В MFC задача решается аналогично.

 
« Предыдущая статья   Следующая статья »