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

C++Builder Discussion :

Déplacer la fenetre d'une application externe


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 145
    Points : 99
    Points
    99
    Par défaut Déplacer la fenetre d'une application externe
    Bonsoir,

    J'aimerais pour déplacer la fenêtre d'un logiciel externe à des coordonnées précisées par mon programme, sachant que je connait le nom du processus de l'application dont je souhaite déplacer la fenêtre. (Cela dit, je ne sais pas si c'est nécessaire ou suffisant).

    Merci d'avance.

  2. #2
    Membre actif Avatar de Bily.sdi
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 208
    Points : 206
    Points
    206
    Par défaut
    tu dois récupérer le Handle de ce processus du programme externe
    exemple plus bas

    pour cela ,
    1°) tu affiche tout les process qui tourne
    2°) tu recherche l'exécutable du programme "a bouger"
    3°) dans les propriété tu récupère son Handle

    exemple pour récupéré le handle via la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Handle = WindowFromPoint(mouse->CursorPos);
    Lecture du texte sous La souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     GetWindowText(Handle,buf,300);
    puis tu le bouge via cette commande

    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
     //deplacement
    MoveWindow( 'le Handle du programme à bouger' ,X,Y,X,Y,true);
     
    explication : 
    BOOL MoveWindow(
        HWND hWnd,         // handle of window
        int X,                   // horizontal position
        int Y,                   // vertical position
        int nWidth,           // width
        int nHeight,          // height
        BOOL bRepaint      // repaint flag
       );
     
     
    //renommer le titre du programme externe
    SetWindowText(Handle,Titre->Text.c_str());
     
    //activer/désactiver le programme externe ( true/false )
    EnableWindow(Handle,false);

    exemple pour recherche un exécutable parmi les processus ouvert

    si il y a 2 processus de même nom , il les retrouvera !!
    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
    
    IMPORTANT ajouter #include <tlhelp32.h>
    
     bool TForm1::ChercheProcess(char nomExe[20]) //exemple : mspaint.exe
    {
      HANDLE hProcessSnap;
      HANDLE hProcess;
      PROCESSENTRY32 pe32;
    
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
      Process32First( hProcessSnap, &pe32 );
    
      do
      {
         // comparaison du nom programme avec la liste des processus
           if( !strcmp(nomExe, pe32.szExeFile) )
             {
    
               //Le handle du processus trouver est : pe32.th32ProcessID
               MoveWindow( pe32.th32ProcessID ,X,Y,X,Y,true);          
    
             }
    
      } 
       while( Process32Next( hProcessSnap, &pe32 ) );
    
     CloseHandle( hProcessSnap );
     return true;
    
    }
    je n'ai pas testé mais ça devrait fonctionner, j'utilise cela pour faire mon propre gestionnaire de taches.

    A toi de jouer

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 145
    Points : 99
    Points
    99
    Par défaut
    Merci beaucoup de ton aide, mais en utilisant le code que tu m'as donné, j'obtient une erreur du fait du handle pe32.th32ProcessID utilisé dans le MoveWindow : "Impossible de convertir 'unsigned long' en 'void*' ".

    Voila le code que j'ai mis :
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
      HANDLE hProcessSnap;
      HANDLE hProcess;
      PROCESSENTRY32 pe32;
     
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
      Process32First( hProcessSnap, &pe32 );
     
      do
      {
         // comparaison du nom programme avec la liste des processus
           if( !strcmp("mspaint.exe", pe32.szExeFile) )
             {
     
               //Le handle du processus trouver est : pe32.th32ProcessID
               MoveWindow(pe32.th32ProcessID,12,20,120,240,true);
               Application->MessageBox("ok","ok");
     
             }
             else
               Application->MessageBox("nok","nok");
     
      }
       while( Process32Next( hProcessSnap, &pe32 ) );
     
     CloseHandle( hProcessSnap );
     
    }
    //---------------------------------------------------------------------------

    En fait, ne faudrait-il pas ouvrir le processeur avant et le déclarer comme tel ? Ou alors, ce ne serais pas plus simple avec un FindWindow ? (en fait, j'ai essayé, mais j'y arrive pas non plus, je m'y prends surement mal.

    Merci d'avance.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 145
    Points : 99
    Points
    99
    Par défaut
    Je crois que je viens de trouver légèrement plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HWND theHandle = FindWindow(NULL, "Nom exacte de la fenêtre");
    SetWindowPos(theHandle,HWND_TOP,0,0,NULL,NULL,SWP_NOSIZE);
    Merci quand même de ton aide !
    Cordialement.

  5. #5
    Membre actif Avatar de Bily.sdi
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 208
    Points : 206
    Points
    206
    Par défaut
    oui c'est aussi bon , mais c'est le nom de la fenetre.

    certains non pas de nom ou le nom change ?!

    si tu as 2 fenêtres , il déplacera qu'une Seule !?

    sinon pour ton erreur , il aurait fallu de créer une variable Handle pid

    pid = pe32.th32ProcessID ou AnsiString pid = pe32.th32ProcessID
    et dans le MoveWindow(pid,...)

    ce qui est bien avec le MoveWindow, tu peux faire une petite animation
    de mouvement ;-)

    mais ta maniere est tt aussi bien

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 145
    Points : 99
    Points
    99
    Par défaut
    Pour ce que je veux faire, je sais que je n'aurais qu'une fenêtre de ce programme d'ouverte, j'ai quand même fait le test par curiosité, lorsque j'en ouvre 2, il déplace la dernière fenêtre que j'ai rendu active.

    Par contre, la solution que tu me propose pour corriger le problème avec ton code ne fonctionne pas, j'obtiens toujours une erreur de mauvaise correspondance

  7. #7
    Membre actif Avatar de Bily.sdi
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 208
    Points : 206
    Points
    206
    Par défaut
    j'ai fais comme ceci et ca marche

    1°) creer une class Handle

    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
     class  handle
    {
      public:
     
      HWND code;      // Handle du process
      AnsiString Titre; // titre du process
      int index;          // nr du process
     
      handle(TForm*o)
      {
       code = NULL;
       Titre = ""; 
       index = -1;
      }
    };
    2°) dans la boucle , nb_process s'incrémentera chaque fois qu'il trouve un
    process

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
         char buf[50];
        int nb_process =0;
     
        taches[nb_process] = new handle(Form1);
     
        HWND PID = GetActiveWindow(); // 
     
        taches[ nb_process ]->code = PID;
     
        taches[ nb_process ]->Titre  = GetWindowText(PID,buf,50);
     
        taches[ nb_process ]->index = process
    3°) pour le problem d'erreur void * en unsigned long

    je vois pas encore la solution : ca compile mais rien ne bouge !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         HWND hwnd;
        hwnd = (HWND) pe32.th32ProcessID;
        MoveWindow(hwnd,100,50,100,50,true);
    je met cela en pause pour le moment,
    le principal c'est que cela fontionne pour toi


    @+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 145
    Points : 99
    Points
    99
    Par défaut
    Bon je te remercie de ton aide. Je met résolu quand même puisque j'y arrive avec la technique du FindWindow(); mais à l'occasion, si tu trouve la solution, je suis preneur.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/01/2008, 09h17
  2. Réponses: 3
    Dernier message: 08/07/2006, 19h59
  3. [Excel] Utiliser une application externe par une macro
    Par thierry2.dlp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2005, 22h07
  4. Réponses: 8
    Dernier message: 17/03/2004, 14h40

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