4

Windows で Qt を使用して開発している 2 つのアプリケーションがあります。ユーザーが 1 つのアプリケーションでボタンを押して、他のアプリケーションをフォアグラウンドにできるようにしたいと考えています。(プログラムは QLocalSocket と名前付きパイプを使用して通信します。)

現在、私は Qt の QWidget::activateWindow() を使用しています。これにより、アプリケーションが前面に表示されることがありますが、ほとんどの場合、タスクバーのプログラムが強調表示されるだけです。

できればQtを使用して、WIN32 APIを使用しても問題ありませんが、誰かがこれを行う方法を教えてください。


残念ながら、Qt だけでこれを行う方法を見つけることができませんでした。現在アクティブなアプリケーションから SetForegroundWindow を呼び出すという Chris Becke の提案を使用して解決しました。

4

6 に答える 6

4

メソッドの上で、!QWidget::activateWindowを呼び出す必要があります。QWidget::raise

ここ では こう い う。

于 2008-10-15T10:09:39.063 に答える
4

これはデバッグの問題ではありませんか? アプリケーションがフォアグラウンドを持っている場合、フォアグラウンドを変更することが許可されます。

ウィンドウ A のボタンをクリックすると、そのウィンドウ スレッドがフォアグラウンドでアクティブ化されます。他のウィンドウで SetForegroundWindow (または同等のもの) を呼び出すと、そのウィンドウがフォアグラウンドになります。

一方、それ自体で SetForeground を試行する他のアプリにメッセージを送信するだけの場合、それは失敗します。AllowSetForegroundWindow は、「レガシ」アプリがフォアグラウンド アプリによってフォアグラウンドを取得するためのアクセス許可を付与される必要がある状況で使用されます。繰り返しますが、AllowSet... は、現在アクティブなフォアグラウンド ウィンドウを所有するスレッドから呼び出された場合にのみ機能します。

于 2008-10-15T13:09:17.593 に答える
1

これはちょっと安っぽいですが、私にとってはうまくいきます:

            this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
            this->show();
            this->setWindowFlags(Qt::FramelessWindowHint);
            this->show();

または、他のフラグがない場合は、

            this->setWindowFlags(Qt::WindowStaysOnTopHint);
            this->show();
            this->setWindowFlags(0);
            this->show();

WindowStaysOnTopHint は、ほとんどの場合、ウィンドウを最前面に強制します。その後、ウィンドウを常に一番上に置いておきたくないので、以前のフラグが何であれリセットしてください。

于 2010-10-27T22:02:45.300 に答える
0

必要な API はAllowSetForegroundWindow()SetForegroundWindow()だと思います。同等の Qt 呼び出しが何であるかはわかりません。

于 2008-10-15T10:56:05.660 に答える
0

アイコン化された状態から可視状態に移行するには、showNormal() を使用します。

于 2009-07-28T15:28:28.583 に答える