2010-12-15 110 views
6

Lors de l'installation de n'importe quelle application. En général, l'utilisateur a été invité à fermer toutes les fenêtres avant le début de l'installation. sinon l'installation s'arrêtera au milieu et demandera à l'utilisateur de fermer toutes les fenêtres ouvertes. On m'a demandé d'ajouter un code dans une application XXX. Lorsque l'application est en cours d'exécution et si l'utilisateur ouvre une autre fenêtre (ex: Explorer, navigateur, mot etc ..) alors l'application devrait lancer une fenêtre en disant que vous avez ouvert la liste des fenêtres. Je vous prie de me suggérer comment commencer en C#.Récupère la liste des fenêtres ouvertes C#

Répondre

0

Essayez SetWinEventHook Fonction WinAPI via P/Invoke. Vous pouvez accrocher EVENT_OBJECT_CREATE événement, mais je ne suis pas sûr à 100%. Je ne l'ai jamais fait en C#, seulement en C/C++.

1

Vous pouvez utiliser la classe System.Diagnostics.Process pour obtenir les informations de tous les processus en cours d'exécution sur votre machine. Ensuite, vous pouvez essayer de trouver si l'application/le processus prévu est en cours d'exécution ou non. Vous pouvez utiliser la méthode GetProcesses() ou GetProcessByName(). Reportez-vous this msdn link pour référence. Je suis sûr qu'il peut y avoir un moyen plus efficace de parvenir au même résultat. HTH

7

Test cette:

var openWindowProcesses = System.Diagnostics.Process.GetProcesses() 
    .Where(p => p.MainWindowHandle != IntPtr.Zero && p.ProcessName != "explorer"); 

Le openWindowProcesses devrait contenir toutes les applications ouvertes qu'ils ont une fenêtre principale active.

Je mets p.ProcessName != "explorer" dans l'expression where car l'explorateur est le processus principal du bureau et il ne devrait jamais être fermé.

Pour observer l'exécution des processus, vous pouvez utiliser la classe ManagementEventWatcher. Voir this s'il vous plaît.

+0

Pour résoudre le problème décrit vous devez obtenir la liste de la fenêtre par minuterie. Et qu'en est-il des fenêtres cachées? – DReJ

+0

Je pense que qui a posé cette question sait à propos de l'utilisation des timers et ... Et des fenêtres cachées; Je pense qu'il suffit de fermer les processus avec des fenêtres non masquées dans de tels scénarios. Bien que dans ces situations, les processus sont plus importants que les fenêtres. Le programmeur devrait vérifier les processus pour savoir lequel ne devrait pas être ouvert. Ceci est facilement possible en changeant l'expression dans la méthode Where. Mais merci! Je vais ajouter quelques informations sur les processus de surveillance dans ma réponse. –

+0

merci beaucoup pour votre suggestion. Une fois que j'implémenterai je vous ferai connaître le résultat – user517206

1

Mettre en place une boucle foreach comme celui-ci d'énumérer sur toutes les applications ouvertes sur votre système (qui ont une fenêtre principale visible)

foreach (var process in Process.GetProcesses().Where(p => p.MainWindowHandle != IntPtr.Zero)) { 
    //do something with the process here. To display it's name, use process.MainWindowTitle 
    } 
+0

Que faire si une application a plusieurs fenêtres visibles? – Neolisk