2010-08-23 2 views
4

J'ai un C++/CLI basée installer l'application qui doit fermer une autre application que j'ai écrit, remplacer le .exe de l'application et dll et la re-exécuter le fichier exécutable.Comment fermer une autre application avec élégance?

d'abord tout ce que je dois fermer cette fenêtre le long des lignes suivantes:

HWND hwnd = FindWindow(NULL, windowTitle); 
if(hwnd != NULL) 
{ 
    ::SendMessage(hwnd, (int)0x????, 0, NULL); 
} 

à savoir trouver un titre de fenêtre correspondant (qui fonctionne) ... mais alors quel message dois-je envoyer la fenêtre à distance pour lui demander de fermer?

... ou est-il un moyen plus-ish .net de Donig ce sans avoir recours à l'API Windows directlry?

nu à l'esprit que je suis limité à Net 2.0

+0

a-t l'application que vous essayez de fermer déjà expédié? Si ce n'est pas le cas, vous pouvez créer un message personnalisé uniquement à cette fin. –

+0

Pourquoi s'embêter quand il y a déjà les messages Windows? –

+1

Parce que 'WM_CLOSE' ne dit pas vraiment à une application de quitter. Il dit à une fenêtre de se fermer. De nombreuses applications se ferment lorsque la fenêtre principale se ferme, mais d'autres non. Ils peuvent avoir d'autres fenêtres ouvertes ou continuer à fonctionner en arrière-plan. En définissant un message personnalisé, vous pouvez vous assurer que l'application fait exactement ce dont vous avez besoin sans surcharger un message déjà bien défini. Merci –

Répondre

5
+0

:) qui a obtenu - merci –

+0

Cette réponse doit être améliorée. Les réponses par lien uniquement ne sont pas de bonnes réponses. envisager d'inclure les détails de fond dans votre réponse. –

-1

MISE À JOUR

Utilisez WM_CLOSE. J'avais tort.

+0

Non. WM_CLOSE est correct. WM_QUIT est pour terminer une boucle de message. La plupart des applications traditionnelles Postez le WM_QUIT à eux-mêmes afin de quitter la boucle de message principale lorsque la fenêtre de niveau principal est détruite. Cette séquence est généralement initiée par WM_CLOSE. –

+0

La fin de la boucle de message entraîne généralement la sortie de l'application vers la droite? Wm close peut ne pas quitter l'application, juste cette fenêtre. Je pourrais bien sûr me tromper :) –

+0

Le problème est que vous ne savez pas quelle boucle de messages vous terminez. Que faire si l'application affiche un dialogue modal? Vous pourriez simplement mettre l'application dans un mauvais état, sans enregistrer les données utilisateur. Je me rétracte ce que j'ai dit à propos de 'WM_CLOSE'.La bonne chose à utiliser est 'WM_QUERYENDSESSION' et' WM_ENDSESSION'. –

1

Dans le cas où quelqu'un veut suivre la façon plus-ish .net des choses Donig, vous pouvez effectuer les opérations suivantes:

using namespace System::Diagnostics; 

array<Process^>^ processes = Process::GetProcessesByName("YourProcessName"); 
for each(Process^ process in processes) 
{ 
    process->CloseMainWindow(); // For Gui apps 
    process->Close(); // For Non-gui apps 
} 
2

Guidelines from MSDN

  1. Envoyer WM_QUERYENDSESSION avec le lParam réglé sur ENDSESSION_CLOSEAPP.
  2. Ensuite, envoyez WM_ENDSESSION avec le même lParam.
  3. Si cela ne fonctionne pas, envoyez WM_CLOSE.
Questions connexes