을 가져올 필요가 응용 프로그램을 포그라운드에서 윈도우

StackOverflow https://stackoverflow.com/questions/204181

  •  03-07-2019
  •  | 
  •  

문제

나는 두 응용 프로그램을 개발하 Qt 를 사용하여 응용 프로그램을 시작합니다.내가 원할 수 있도록 사용자를 버튼을 눌러 하나의 응용 프로그램에는 다른 응용 프로그램 온라를 연결합니다.(프로그램을 사용하여 통신 QLocalSocket 및 라는 파이프입니다.)

현재 사용하고 이 문제에 대한::activateWindow()는 때때로 제공 응용 프로그램을 포그라운드,하지만 대부분의 시간 그냥 하이라이트 프로그램 작업 표시줄에 있습니다.

리할 수 있습니다 어떻게 이를 위해,바람직하게 사용하는 Qt 지만 실패하는 WIN32API 를 사용하는 것이 좋습니다.


불행하게도,나는 방법을 발견할 수 없었지만 이와 함께 Qt.나는 그것을 해결을 사용하여 크리스 Becke 의 제안의 호출 SetForegroundWindow 에서 현재 활성화된 응용 프로그램.

도움이 되었습니까?

해결책

이것이 디버깅 문제가 아니라고 확신합니까? 거래는 응용 프로그램에 전경이있는 경우 전경을 변경할 수 있습니다.

Window A의 버튼을 클릭하면 해당 Windows 스레드 전경 활성화가 제공됩니다. 다른 창에서 setforegroundwindow (또는 동등한) 호출하는 경우 해당 창에 전경이 주어집니다.

반면에, 단순히 다른 앱에 메시지를 보내면 Foreground 자체를 설정하려고 시도하면 실패합니다. allowetforegroundwindow는 전경 앱을 통해 '레거시'앱에 권한을 부여 해야하는 상황에서 사용됩니다. 다시 한 번, 허용 ... 현재 활성 전경 창을 소유 한 스레드에서 호출 된 경우에만 작동합니다.

다른 팁

위에 QWidget::activateWindow 방법, 당신은 호출해야합니다 QWidget::raise !

이것이 말하는 것입니다 여기.

나는 비슷한 경우입니다.

나는 두 Qt 응용 프로그램과 통신하는 소켓에.고 싶을 가지고 창의 응용 프로그램 B,최대 버튼을 통해서 응용 프로그램 A.

내가 찾는 때때로 위젯을 상태가 올바르게 설정되어 있지 않은,그래서 event() 함수의 환경에 맞게 적 B 의 위젯을 나는 다음과 같다:

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);
}

나를 보내는 명령에서 응용 프로그램 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, 으로,Qt3.3.나 MainWidget 가에서 파생 QWidget.

내가 찾은 이것은 또한 작업으로 위젯에서 파생 QMainWindow, 하지만,일부 문제입니다.다음과 같은 경우 다른 아이 창이 열려 있습니다.

이러한 경우에 저장 위치에 아동의 윈도우와 그들을 숨기,다음 사용 BringUpWidget 기능을 가지고 나 MainWindow 위젯,그리고 다음을 복원 아 windows.

이것은 일종의 치즈이지만 나에게 효과적입니다.

            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라고 생각합니다 allowetfore groundwindow () 그리고 setforegroundwindow (). 동등한 QT 호출이 무엇인지 모르겠습니다.

Showormal ()을 사용하여 가상 상태에서 가시 상태로 이동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top