Precisa trazer aplicativos de primeiro plano no Windows
Pergunta
Eu tenho dois aplicativos que estou desenvolvendo usando Qt no windows. Eu quero o usuário seja capaz de pressionar um botão em um aplicativo que faz com que o outro aplicativo vem para o primeiro plano. (Os programas comunicar usando QLocalSocket e pipes nomeados.)
Atualmente estou usando QWidget :: ActivateWindow do Qt () que ocasionalmente traz o aplicativo para o primeiro plano, mas na maioria das vezes ele só destaca o programa na barra de tarefas.
Alguém por favor pode me dizer como fazer isso, de preferência usando Qt embora não que o uso da API Win32 seria ótimo.
Infelizmente, eu não poderia encontrar uma maneira de fazer isso apenas com o Qt. Eu resolvi-lo usando a sugestão de Chris Becke de chamar SetForegroundWindow do aplicativo ativo no momento.
Solução
Tem certeza que isso não é uma questão de depuração? O negócio é, se um aplicativo tem primeiro plano, é permitido mudar o plano.
Ao clicar em um botão na janela Um vai dar que a ativação do Windows segmento de primeiro plano. Se ele chama SetForegroundWindow (ou equivalente) na outra janela, essa janela será dado o primeiro plano.
Se, por outro lado, ele simplesmente envia uma mensagem para outro aplicativo, que tenta SetForeground sobre si mesmo, que irá falhar. AllowSetForegroundWindow é usado em situações em que um aplicativo 'legado' deve ser dada permissão - por um aplicativo de primeiro plano - para tomar o primeiro plano. Mais uma vez, AllowSet ... só funciona se for chamado a partir de um segmento que possui o atual janela em primeiro plano ativo.
Outras dicas
No topo do método QWidget::activateWindow
, você deve chamar QWidget::raise
!
Isto é o que é dito aqui .
Eu tenho um caso similar.
Eu tenho dois aplicativos Qt, A e B, que se comunicam em um soquete. Eu gostaria de trazer uma janela de aplicação B-se, através de um botão no aplicativo A.
Descobri que às vezes o estado do widget não está definido corretamente, por isso, a função event()
da minha applicatons B do widget eu fiz o seguinte:
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);
}
Estou enviando um comando do aplicativo A para B. No recebê-lo, a aplicação B chama a seguinte função em si:
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();
}
Isso funciona para mim, sobre Windows XP , com Qt 3.3. Meu MainWidget
é derivada de uma QWidget
.
Eu encontrei este também está trabalhando com um widget derivado de QMainWindow
, mas com alguns problemas. Como se algumas outras janelas filho estão abertas.
Para esse caso, eu armazenar a posição das janelas filho e escondê-los, em seguida, usar a função BringUpWidget
para trazer meu widget MainWindow
, e em seguida, restaurar as janelas filho.
Este é um tipo de queijo, mas funciona para mim:
this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
this->show();
this->setWindowFlags(Qt::FramelessWindowHint);
this->show();
Ou, se você não tem outras bandeiras,
this->setWindowFlags(Qt::WindowStaysOnTopHint);
this->show();
this->setWindowFlags(0);
this->show();
WindowStaysOnTopHint quase sempre forçar a janela para o primeiro plano. Depois, você realmente não quer que a janela sempre permanecer no topo, então redefinir a tudo o que as bandeiras anteriores foram.
Eu acho que as APIs que você precisa são AllowSetForegroundWindow () e SetForegroundWindow () . Eu não sei o que as chamadas Qt equivalentes são.
Use SHOWNORMAL () para ir de um estado iconified para um estado visível.