IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Permuter automatiquement deux applications Qt ouvertes en plein écran


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut Permuter automatiquement deux applications Qt ouvertes en plein écran
    bonjour,

    J'ai 2 applications Qt ouvertes en plein écran et je voudrais, à l'aide d'un bouton, permuter automatiquement les 2 applications. Actuellement, je suis obligé de minimiser l'application ouverte vers la barre des taches puis ouvrir la seconde depuis la barre des taches.

    Je souhaiterai savoir s'il existe un mécanisme, sous Qt, qui me permettrai de faire cette opération.

    Pour l'idée, il existe QtSingleApplication qui permet de n'ouvrir qu'une seule application (ça envoie des signaux aux systèmes, je crois).

    Y-aurait-il un truc semblable qui envoie des signaux pour permettre la permutation?

    Merci par avance!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Qt ne propose pas des masses de fonctionnalités IPC (inter process communication). Il y a bien Dbus, mais linux / unix uniqument.

    Une des solutions est de passer par un QlocalSocket:

    http://qt.developpez.com/doc/latest/examples-ipc.html

    et de mettre en place un petit protocole pour permettre à tes applications de dialoguer entre elles.


    Edit: il y a ptet un souci avec cette solution en fonction des window manager: la plupart d'entre eux empêchent le "focus stealing", ce qui fait qu'une application B ne peut pas prendre le focus tant qu'il est sur une application A ; ce n'est que:
    - l'utilisateur
    - l'application A
    qui peuvent donner le focus à l'appli B.

    Une autre solution, mais c'est à faire pour chaque plateforme (à moins que je n'aie loupé qqch dans la doc Qt), et c'est pas super joli comme code, c'est de récupérer le winId de la fenêtre que tu veux activer, et utiliser une fonction système pour la mettre au premier plan.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut
    ...c'est bien ce que j'avais vu. pour l'instant, je creuse la solution winId (car mon appli est voué à fonctionner sur windows seulement). Par contre je n'ai pas encore trouver la fonction système qui permet de mettre au premier plan mon appli. Une idée?

    Deuxième solution : je regarde du côté des QSemaphore (mais là je tâtonne pour l'instant....)

    Merci!

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Jette un oeil à ShowWindow:

    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef WIN32
      ShowWindow( m_HWnd, SW_SHOWNORMAL );
    #endif
    où m_HWnd est le window handle...

    Du coup la difficulté reste juste à passer le window handle d'une application à l'autre. Une solution est de passer par la sortie standard, l'application A lance l'appli B, l'appli B écrit son winId sur la sortie standard qui est lue par A, et A peut donc afficher la fenêtre de B.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut
    ...pour ceux que ça intéresse, ça marche avec ce code sous windows.

    Le principe est :

    (1) de créer un CALLBACK (cf EnumWindowsProc) qui énumère les "top-level window handlesprocess"


    (2) ouvrir l'autre fenêtre avec la fonction SwitchToThisWindow( HWND hWnd, BOOL fAltTab). Il y a un test sur les noms des programmes puis un test sur entre le PID courrant avec GetCurrentProcessId() et le PID que je veux ouvrir (qui est en "background"). Et hop, le tour est joué , je permute les fenêtres!



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
    #include <psapi.h>
     
    QString NameOfProcessID(DWORD processID)
    {
        TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
     
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                       PROCESS_VM_READ,
                                       FALSE, processID );
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;
     
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
                 &cbNeeded) ) {
                GetModuleBaseName( hProcess, hMod, szProcessName,
                                   sizeof(szProcessName)/sizeof(TCHAR) );
            }
        }
     
        QString qstrMessage;
     
        #ifdef UNICODE
        qstrMessage = QString::fromUtf16((ushort*)szProcessName);
        #else
        qstrMessage = QString::fromLocal8Bit(szProcessName);
        #endif
        CloseHandle(hProcess);
        return qstrMessage;
    }
     
    static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        MainWindow* m_window=(MainWindow*) lParam;
        DWORD windowpid;
        GetWindowThreadProcessId(hwnd, &windowpid);
        m_window->SwitchToWindow(NameOfProcessID(windowpid), "nom_du_prog.exe", windowpid, hwnd);
     
        return 1;
    }
     
     
     
    ....
     
    void MainWindow::slotSwitchWindow() //// connection vers un SLOT (à créer) qui éxécute la fonction
    {
        EnumWindows(EnumWindowsProc, (LPARAM) this);
    }
     
    void MainWindow::SwitchToWindow(QString processName, QString program, unsigned long pid, HWND handle)
    {
        DWORD windowpid=pid;
     
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                       PROCESS_VM_READ,
                                       FALSE, windowpid );
     
        if (processName==program){
            if(NULL != hProcess){
                if(GetCurrentProcessId()!=windowpid){
                    SwitchToThisWindow(handle, true);
                    return;
                }
            }
        }
        CloseHandle(hProcess);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2008, 15h24
  2. Relation entre deux application
    Par tk_dlph dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 28/11/2005, 09h27
  3. Lancement automatique d'application
    Par atao29 dans le forum MFC
    Réponses: 2
    Dernier message: 18/10/2005, 14h03
  4. Réponses: 6
    Dernier message: 09/04/2005, 11h20
  5. [GNU Pascal] Lancer une application en plein écran
    Par joleboss dans le forum Autres IDE
    Réponses: 13
    Dernier message: 20/05/2004, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo