2016-09-28 2 views
1

У меня есть приложение Qt, которое остается поверх других окон. Главное окно бескаркасное и прозрачное. Чтобы поставить его поверх других окон, я выполнил следующую процедуру.Как я могу поместить мое главное окно приложения Qt всегда над панелью задач в Windows?

SetForegroundWindow((HWND)winId()); 
Qt::WindowFlags flags = this->windowFlags(); 
flags = flags & ~Qt::WindowMinimizeButtonHint; 
this->setWindowFlags(flags|Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); 
ui.setupUi(this); 

Этот фрагмент кода приносит мой Qt-заголовок поверх всех окон, а также над панелью задач. Проблема в том, что всякий раз, когда нажимается какая-либо область панели задач, область mainwindow над taskabr идет за панель задач. Панель задач выходит на передний план. Главное окно все еще остается над всем другим окном. Похоже, что нижняя область моего главного окна позади панели задач.

Как я могу препятствовать тому, чтобы панель задач нажала область главного окна за собой? Я хочу сохранить свое окно над всеми окнами, а также над панелью задач.

+1

Вы уверены, что спросили себя, обладает ли этот дизайн хорошим пользовательским интерфейсом? Как пользователь, я был бы сильно расстроен, если бы что-то пыталось скрыть панель задач во все времена ... –

ответ

2

Вы не можете. Qt::WindowsStaysOnTopHint отмечает окно с окном WS_EX_TOPMOST, и все такие окна могут лежать друг на друга. См. Случайные тирады Раймонда Чена на The Old New Thing.

Лучше всего ограничить положение вашего окна, чтобы его нельзя было перемещать поверх панели задач.

0

, если вы можете получить доступ к Windows API или Qt имеет эквивалентную функцию можно использовать SetWindowPos

например

SetWindowPos(hWnd, ((HWND)-1), 0, 0, width, height, 0); 

где HWND является дескриптор окна и ширина и высота, ширина и высота экрана (если вы хотите его в полноэкранном режиме). Передача -1 как HWND будет помещать окно над всеми другими не-верхними окнами. Он останется включенным даже после того, как окно будет отключено.

0

Спасибо за ответы. Спасибо Мартин Боннер за предоставление ссылки на блог The Old New Thing.

Я попробовал альтернативу с помощью таймера и поднял мое окно над другой панелью задач. Мое окно полностью прозрачно, без рамки без заголовка и строки состояния. Он содержит только прямоугольную рамку и некоторые кнопки внизу.

Я поднимаю окно каждые 500 м над панелью задач. Поэтому, если пользователь нажимает на любой регион на панели задач, часть моего окна за панель задач возвращается на передний план снова.

if (this->isActiveWindow() == false) 
    this->raise(); 

Да это способ поднятия окна может вызвать гонку вокруг условий, если любое другое приложение использует подобный подход приподняться выше задач. Так что, я думаю, чтобы убедиться, что этот метод работает правильно, два приложения, имеющие аналогичный подход для повышения, не должны запускаться вместе.