Fermeture d'application par mon programme

Fermeture d'application par mon programme - API Win32 - Programmation

Marsh Posté le 15-06-2009 à 14:34:55    

Bonjour,
Je cherche à fermer les applications que l'on peut voir dans la barre de tâche en bas à partir de mon programme Windows (je ne programme pas en C++ mais en C). Je ne sais pas trop comment faire pour trouver les applications ouvertes et ainsi les fermer. J'ai essayé avec EnumWindow() mais je n'arrive pas trop à le faire fonctionner correctement.
J'espère pouvoir trouver de l'aide ici. :)

Reply

Marsh Posté le 15-06-2009 à 14:34:55   

Reply

Marsh Posté le 15-06-2009 à 15:37:30    

Il faut effectivement utiliser EnumWindows, dont la callback appellera la fonction IsIconic() pour détecter si la fenêtre est iconifiée ou pas, et la fermera le cas échéant.
 
Un exemple à l'arrache

Code :
  1. // ton code
  2. EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
  3.  
  4. // callback qui va passer toutes les fenêtres ouvertes en revue, et qui va fermer celles qui sont iconifiées
  5. BOOL EnumWindowsProc(HWND hWnd, long lParam)
  6. {
  7.      if (IsIconic(hWnd))
  8.      {
  9.         SendMessage(hWnd, WM_QUIT, 0, 0);
  10.      }
  11.      return TRUE;
  12. }


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-06-2009 à 15:50:04    

Ok mais je veu le faire que pour les applications qui sont dans la barre de tache (il me semble bien que ca s'appelle comme ça). Des application du genre Mozilla, Dev C++, Visual C++ etc...
J'ai réussi a avoir le nom qu'il y a marqué en bas parmi beaucoup d'autre applications qui sont lancées et qui ne sont pas en bas surement des processus mais je veux faire le tri dedans.


---------------
Enfin un PC digne de ce nom!
Reply

Marsh Posté le 15-06-2009 à 15:52:37    

gofio79 a écrit :

Ok mais je veu le faire que pour les applications qui sont dans la barre de tache (il me semble bien que ca s'appelle comme ça). Des application du genre Mozilla, Dev C++, Visual C++ etc...
J'ai réussi a avoir le nom qu'il y a marqué en bas parmi beaucoup d'autre applications qui sont lancées et qui ne sont pas en bas surement des processus mais je veux faire le tri dedans.


Tu peux clarifier ce point stp ? Pour moi, une 'application qui est dans la barre des taches", c'est une application iconifiée dans la barre des taches (donc non visible ailleurs que dans cette fameuse barre).


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-06-2009 à 16:08:17    

C'est bien la barre de tache que ça s'appelle à coté de démarrer? Et une fenêtre iconifier c'est une fenêtre qui est à coté de l'heure.
J'ai remplacer IsIconic() par IsWindowVisible() et je retrouve les bon programme mai maintenant faut que je les ferme car ca ne marche pas avec SendMessage().


---------------
Enfin un PC digne de ce nom!
Reply

Marsh Posté le 15-06-2009 à 16:37:48    

gofio79 a écrit :

C'est bien la barre de tache que ça s'appelle à coté de démarrer? Et une fenêtre iconifier c'est une fenêtre qui est à coté de l'heure.
J'ai remplacer IsIconic() par IsWindowVisible() et je retrouve les bon programme mai maintenant faut que je les ferme car ca ne marche pas avec SendMessage().


Au temps pour moi, c'est pas WM_QUIT qu'il faut envoyer, mais WM_CLOSE

Code :
  1. BOOL EnumWindowsProc(HWND hWnd, long lParam)
  2. {
  3.      if (!IsWindowVisible(hWnd))
  4.      {
  5.         SendMessage(hWnd, WM_CLOSE, 0, 0);
  6.      }
  7.      return TRUE;
  8. }


Message édité par Harkonnen le 15-06-2009 à 16:39:28

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-06-2009 à 16:53:55    

Oui j'ai trouvé!
Merci beaucoup pour ton aide!
J'ai fait un mélange d'un autre truc que j'avais trouvé pour ne pas fermer tous les truc. Car j'en ai des importants.

Code :
  1. BOOL CALLBACK fonctionEnumerationFenetre(HWND hwnd, LPARAM lParam)
  2. {
  3. if(hwnd!=Dlg)
  4. {
  5.  if (IsWindowVisible(hwnd))
  6.   {
  7.   int taille = GetWindowTextLength(hwnd);
  8.   if (taille)
  9.   {
  10.    char *texte = new char[taille+1];
  11.    char comp[] = "Acquisition Data MDM";
  12.    int siz = GetWindowText(hwnd,texte,taille+1);
  13.    if (strstr(texte,comp)==NULL)
  14.    { if(strstr(texte,"Program Manager" )==NULL)
  15.     { if(strstr(texte,"RocketDock" )==NULL)
  16.       SendMessage(hwnd, WM_CLOSE, 0, 0);
  17.     }
  18.    }
  19.   }
  20.  }
  21. }
  22.      return TRUE;
  23. }


Merci d'avoir répondu aussi rapidement.


---------------
Enfin un PC digne de ce nom!
Reply

Marsh Posté le 15-06-2009 à 17:16:00    

Euh... j'espère que tu ne comptes pas mettre ce code en production, à moins que tu aies envie de vider toute la mémoire de ton utilisateur [:heink]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-06-2009 à 11:17:01    

Pourquoi qu'est ce qu'il à ce code?


---------------
Enfin un PC digne de ce nom!
Reply

Marsh Posté le 16-06-2009 à 11:53:02    

- Les lignes 13, 14 et 15 pourraient être réduites à une seule ligne via l'opérateur &&
- La mémoire que tu alloues à la ligne 10 n'est jamais libérée.
- Toujours à cette ligne 10, pourquoi faire une allocation dynamique au lieu de déclarer tout simplement un tableau statique ?
- L'opérateur "new" est un opérateur du C++, toi tu fais apparemment du C, donc il faut utiliser malloc(). Mais je le répète, un tableau déclaré sur la pile est amplement suffisant
- La ligne 11 est inutile, pourquoi ne pas la supprimer et mettre la chaine "Acquisition Data MDM" directement à la place de ta variable "comp" à la ligne 13 ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-06-2009 à 11:53:02   

Reply

Marsh Posté le 16-06-2009 à 13:06:22    

Oui c'est vrai je n'avais pas encore optimisé mon code c'est pour ca.
Je te remercie de toutes les info que tu m'as donné.


---------------
Enfin un PC digne de ce nom!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed