Сообщений 3    Оценка 72        Оценить  
Система Orphus

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

Автор: Александр Шаргин
Опубликовано: 21.06.2001
Исправлено: 13.03.2005
Версия текста: 1.0

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

Способ 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). Если вас это не устраивает, придётся использовать другой способ.


Рисунок 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 задача решается аналогично.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 3    Оценка 72        Оценить