Windowsでアプリケーションをフォアグラウンドに持ってくる必要がある
質問
WindowsでQtを使用して開発している2つのアプリケーションがあります。ユーザーが1つのアプリケーションでボタンを押して、他のアプリケーションを前面に表示できるようにしたいのです。 (プログラムはQLocalSocketと名前付きパイプを使用して通信します。)
現在、QtのQWidget :: activateWindow()を使用しています。これにより、アプリケーションがときどき前面に表示されますが、ほとんどの場合、タスクバーのプログラムが強調表示されます。
できればQtを使用してこれを行う方法を教えてください。WIN32APIを使用しても問題はありません。
残念ながら、Qtでのみこれを行う方法は見つかりませんでした。現在アクティブなアプリケーションからSetForegroundWindowを呼び出すというChris Beckeの提案を使用して解決しました。
解決
これはデバッグの問題ではないのですか?取引は、アプリケーションがフォアグラウンドを持っている場合、フォアグラウンドを変更することを許可されます。
ウィンドウAのボタンをクリックすると、そのウィンドウにフォアグラウンドのアクティブ化が行われます。他のウィンドウでSetForegroundWindow(または同等のもの)を呼び出すと、そのウィンドウにフォアグラウンドが与えられます。
一方、単にメッセージを他のアプリに送信し、それ自体でSetForegroundを試行すると、失敗します。 AllowSetForegroundWindowは、フォアグラウンドを取得するために、「レガシー」アプリに許可を与える必要がある場合(フォアグラウンドアプリから)に使用されます。もう一度、AllowSet ...は、現在アクティブな前景ウィンドウを所有するスレッドから呼び出された場合にのみ機能します。
他のヒント
QWidget :: activateWindow
メソッドの上で、 QWidget :: raise
を呼び出す必要があります!
これは、こちらと言われています。
同様のケースがあります。
ソケットで通信するAとBの2つのQtアプリケーションがあります。 アプリケーションAのボタンを使用して、アプリケーションBのウィンドウを表示したいです。
ウィジェットの状態が正しく設定されていないことがあるため、アプリケーションBのウィジェットの event()
関数で次のことを行いました:
bool MyWidgetB:event ( QEvent * e )
{
QEvent::Type type = e->type ();
// Somehow the correct state of window is not getting set,
// so doing it manually
if( e->type() == QEvent::Hide)
{
this->setWindowState(WindowMinimized);
}
else if( e->type() == QEvent::Show )
{
this->setWindowState((this->windowState() & ~WindowMinimized) |
WindowActive);
}
return QWidget::event(e);
}
コマンドをアプリケーションAからBに送信しています。コマンドBを受信すると、アプリケーションBはそれ自体で次の関数を呼び出します。
void BringUpWidget(QWidget* pWidget)
{
pWidget ->showMinimized(); // This is to bring up the window if not minimized
// but beneath some other window
pWidget ->setWindowState(Qt::WindowActive);
pWidget ->showNormal();
}
これは、 Windows  XP で、Qt 3.3で機能します。私の MainWidget
は、 QWidget
から派生しています。
これは QMainWindow
から派生したウィジェットでも動作しますが、いくつかの問題があります。他の子ウィンドウが開いている場合のように。
このような場合、子ウィンドウの位置を保存して非表示にし、 BringUpWidget
関数を使用して MainWindow
ウィジェットを表示し、子ウィンドウを復元します。
これはちょっと安っぽいですが、私には有効です:
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は、ほとんど常にウィンドウを前面に強制します。その後、ウィンドウを常に一番上にしたくないので、以前のフラグが何であれリセットしてください。
必要なAPIは AllowSetForegroundWindow()であると思いますおよび SetForegroundWindow()。同等のQt呼び出しが何であるかわかりません。
showNormal()を使用して、アイコン化された状態から可視状態に移行します。