J'ai un scénario où je dois vérifier si l'utilisateur a déjà ouvert Microsoft Word. S'il l'a fait, je dois alors arrêter le processus winword.exe et continuer à exécuter mon code.
Est-ce que quelqu'un a un code simple pour tuer un processus en utilisant vb.net ou c #?
Vous voudrez utiliser la méthode System.Diagnostics.Process.Kill . Vous pouvez obtenir le processus souhaité à l'aide de System.Diagnostics.Proccess.GetProcessesByName .
Des exemples ont déjà été postés ici, mais j’ai trouvé que la version non-.exe fonctionnait mieux. Quelque chose comme:
foreach ( Process p in System.Diagnostics.Process.GetProcessesByName("winword") )
{
try
{
p.Kill();
p.WaitForExit(); // possibly with a timeout
}
catch ( Win32Exception winException )
{
// process was terminating or can't be terminated - deal with it
}
catch ( InvalidOperationException invalidException )
{
// process has already exited - might be able to let this one go
}
}
Vous n'avez probablement pas à traiter avec NotSupportedException
, ce qui suggère que le processus est distant.
Il est possible de tuer carrément le mot (voir certaines des autres réponses), mais carrément grossier et dangereux: que se passera-t-il si l'utilisateur a d'importantes modifications non enregistrées dans un document ouvert? Sans parler des fichiers temporaires obsolètes que cela laissera derrière ...
C'est probablement aussi loin que vous pouvez aller à cet égard (VB.NET):
Dim proc = Process.GetProcessesByName("winword")
For i As Integer = 0 To proc.Count - 1
proc(i).CloseMainWindow()
Next i
Cela fermera toutes les fenêtres Word ouvertes de manière ordonnée (en invitant l'utilisateur à enregistrer son travail, le cas échéant). Bien entendu, l'utilisateur peut toujours cliquer sur "Annuler" dans ce scénario. Vous devriez donc pouvoir également gérer ce cas (de préférence en affichant un dialogue "fermez toutes les instances de Word, sinon nous ne pourrons pas continuer" ... )
Voici un exemple simple sur la façon de tuer tous les processus Word.
Process[] procs = Process.GetProcessesByName("winword");
foreach (Process proc in procs)
proc.Kill();
Vous pouvez contourner les problèmes de sécurité et créer une application beaucoup plus polie en vérifiant simplement si le processus Word est en cours d'exécution et en demandant à l'utilisateur de le fermer, puis cliquez sur le bouton "Continuer" de votre application. C'est l'approche adoptée par de nombreux installateurs.
private bool isWordRunning()
{
return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0;
}
Bien sûr, vous ne pouvez le faire que si votre application dispose d'une interface graphique.
public bool FindAndKillProcess(string name)
{
//here we're going to get a list of all running processes on
//the computer
foreach (Process clsProcess in Process.GetProcesses()) {
//now we're going to see if any of the running processes
//match the currently running processes by using the StartsWith Method,
//this prevents us from incluing the .EXE for the process we're looking for.
//. Be sure to not
//add the .exe to the name you provide, i.e: NOTEPAD,
//not NOTEPAD.EXE or false is always returned even if
//notepad is running
if (clsProcess.ProcessName.StartsWith(name))
{
//since we found the proccess we now need to use the
//Kill Method to kill the process. Remember, if you have
//the process running more than once, say IE open 4
//times the loop thr way it is now will close all 4,
//if you want it to just close the first one it finds
//then add a return; after the Kill
try
{
clsProcess.Kill();
}
catch
{
return false;
}
//process killed, return true
return true;
}
}
//process not found, return false
return false;
}
Dans mon application Plateau, je devais nettoyer Excel et Word Interops. Donc, cette méthode simple tue les processus de manière générique.
Ceci utilise un gestionnaire d'exception général, mais pourrait être facilement fractionné pour plusieurs exceptions, comme indiqué dans d'autres réponses. Je peux le faire si mon enregistrement produit beaucoup de faux positifs (c’est-à-dire que je ne peux pas tuer déjà tué). Mais jusqu'à présent, guid (blague de travail).
/// <summary>
/// Kills Processes By Name
/// </summary>
/// <param name="names">List of Process Names</param>
private void killProcesses(List<string> names)
{
var processes = new List<Process>();
foreach (var name in names)
processes.AddRange(Process.GetProcessesByName(name).ToList());
foreach (Process p in processes)
{
try
{
p.Kill();
p.WaitForExit();
}
catch (Exception ex)
{
// Logging
RunProcess.insertFeedback("Clean Processes Failed", ex);
}
}
}
Voici comment je l'ai appelé alors:
killProcesses((new List<string>() { "winword", "Excel" }));
Quelque chose comme ça va marcher:
foreach ( Process process in Process.GetProcessesByName( "winword" ) )
{
process.Kill();
process.WaitForExit();
}
Il est préférable, plus sûr et plus poli, de détecter si le processus est en cours d'exécution et d'indiquer à l'utilisateur de le fermer manuellement. Bien sûr, vous pouvez également ajouter un délai d'attente et mettre fin au processus s'ils sont partis ...