2016-09-28 10 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メインウィンドウをすべてのウィンドウの上とタスクバーの上に表示します。 問題は、タスクバーの任意の領域がクリックされるたびに、タスクバー上のメインウィンドウの領域がタスクバーの背後にあることです。タスクバーが前面に来る。メインウィンドウはまだ他のすべてのウィンドウの上に残っています。メインウィンドウの下部領域がタスクバーの後ろにあるようです。

タスクバーがメインウィンドウの領域を自分自身の背後に押し込まないようにするにはどうすればよいですか?私はウィンドウをすべてのウィンドウの上とタスクバーの上に保ちたい。

+1

このデザインが優れたユーザーエクスペリエンスを提供しているかどうかは確かですか?ユーザーとして、何かがいつでもタスクバーを隠すことを試みたら、私は大騒ぎになるだろう... –

答えて

2

できません。 Qt::WindowsStaysOnTopHintはウィンドウのスタイルをWS_EX_TOPMOSTとマークしており、そのようなウィンドウはすべて重ねて表示されます。レイモンド・チェンの偶然の言葉はThe Old New Thingです。

あなたの最善の策は、タスクバーの上に移動できないようにウィンドウの位置を制限することです。

0

あなたは、Windows APIにアクセスできるか、Qtはあなたが使用できる同等の機能を有していればSetWindowPos

例えば

のhWndは、あなたの窓と幅と高さのハンドルです
SetWindowPos(hWnd, ((HWND)-1), 0, 0, width, height, 0); 

は、幅と高さあなたがそれを全画面にしたいならば、画面の(あなたがそれを望むならば)。 -1をHWNDとして渡すと、ウィンドウは他のすべてのウィンドウの上に置かれます。ウィンドウが非アクティブになった後でも上に残ります。

0

回答ありがとうございます。 blog The Old New Thingへの参照を提供してくれたMartin Bonnerに感謝します。

私はタイマーを使用して、他のタスクバー上に私のウィンドウを上げることによって、代替手段を試しました。私のウィンドウは完全に透過的で、タイトルバーとステータスバーのないフレームレスです。これは、四角い枠と、下にいくつかのボタンだけを含んでいます。

タスクバーの500msごとにウィンドウを上げています。したがって、ユーザーがタスクバーの任意の領域をクリックすると、タスクバーの後ろのウィンドウの部分が再び前面に表示されます。

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

他のアプリケーションがある場合は、[はい、ウィンドウを上げ、この方法は、タスクバーの上に自分自身を高めるために同様のアプローチを使用して条件の周りにレースを誘導することができます。 私は、この方法が正しく動作することを確かめるために、2つのアプリケーションが同じようなアプローチを持っていて、一緒に実行しないでください。

関連する問題