Je pouvais voir beaucoup de threads très similaires tout autour, mais rien ne semble me donner une solution qui devrait être très basique.
de mon application WinForms, j'ai besoin de fermer une instance d'exécution d'un document Word ( ouvert de la demande elle-même). Lorsque j'ouvre le document Word de l'application, j'en tiens une trousse dans une liste. Maintenant, comment puis-je fermer le même doc? P>
Voici ce que j'ai essayé: p> i obtenir beaucoup de méthodes pour l'objet de document, mais seulement un Quel est le moyen idéal? Merci .. p> EDIT: P> Je ne peux pas fermer l'ensemble de l'application Word (WinWork) car les utilisateurs peuvent avoir d'autres fichiers Word ouverts. P> li>
Je dois simplement mettre fin à l'instance de mot (quelque chose comme .close () < / Code> Pour fermer Qui a des arguments comme celui-ci:
Object SAVECHANGES, REF Object OriginalFormat, Ref Object RoudeDocument Code> Ce que je ne comprends pas. P>
processus.kill () code>) sans aucune invite à l'utilisateur à sauvegarder ou non. P> Li>
ol> p>
4 Réponses :
Que diriez-vous d'utiliser quelque chose comme:
modifié à partir de: http: //www.dreamincode. NET / CODE / SNIPPET1541.HTM P>
public static bool KillProcess(string name) { //here we're going to get a list of all running processes on //the computer foreach (Process clsProcess in Process.GetProcesses()) { if (Process.GetCurrentProcess().Id == clsProcess.Id) continue; //now we're going to see if any of the running processes //match the currently running processes. 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. //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 if (clsProcess.ProcessName.Contains(name)) { clsProcess.Kill(); return true; } } //otherwise we return a false return false; }
Chuck, cette méthode recherche des processus par leurs noms. Par exemple, mon fichier Word peut avoir le nom (argument i pass) "c: \ doc.doc" pendant que le nom du processus est Win Winword qui ne correspond pas. Par conséquent .Kill () n'est jamais frappé.
Cette solution a reçu de ici A > résoudre.
@nawfal: J'ai le même problème, lorsque j'exécute le programme et un autre document avec le même nom est ouvert (en fait, il a été fermé sans disposition (dans une situation), ce code dose ne fonctionne pas, je veux dire que je Obtenez l'erreur qu'une autre instance est en cours d'exécution. Et comme vous l'avez dit, je ne peux pas fermer l'ensemble de la WinWord.exe, car les utilisateurs peuvent avoir d'autres fichiers Word ouverts.it me rend fou, j'espère que vous pourrez me donner de l'aide.
@nawfa: L'erreur que j'ai dit est la suivante: Word ne peut pas enregistrer ce fichier car il est déjà ouvert ailleurs.
@RAHA, faites-en une autre question et verse plus de lumière là-bas. C'est difficile de donner une solution d'ici. Tout ce que je peux dire, c'est que vous devez utiliser des codes intelligents pour disposer des instances existantes de Word. Veuillez rechercher "Élimination de l'instance de mot" ou. Beaucoup de fils sont là sur tellement
@ Nawfal: Merci, mais j'ai déjà apporté une autre question et recherché sur Internet pendant une journée entière, mais je n'ai trouvé aucune solution, merci de toute façon.
Je sais que c'est trop tard, mais j'ai trouvé ce sujet parce que j'avais le même problème.
Et ma solution peut aider les autres personnes. P>
La solution ci-dessus n'a pas bien fonctionné parce qu'elle a tué tous les l'instance de mot, bien qu'elle n'ait pas été ouverte par le programme C #, mais l'utilisateur. P>
Donc, ce n'était donc pas si candidat. p>
Mon code vérifie les processus avant / après la création du mot
processID code> est introuvable dans la liste
private void killProcesses(List<int> processesbeforegen, List<int> processesaftergen)
{
foreach (int pidafter in processesaftergen)
{
bool processfound = false;
foreach (int pidbefore in processesbeforegen)
{
if (pidafter == pidbefore)
{
processfound = true;
}
}
if (processfound == false)
{
Process clsProcess = Process.GetProcessById(pidafter);
clsProcess.Kill();
}
}
}
Cette approche ne devrait certainement pas être utilisée, car il n'y a pas de sécurité. Tout nombre de processus pourrait être démarré entre les appels ...
Pas si vous appelez la deuxième méthode juste après avoir créé l'objet de l'application Word et le démarrage du processus. Eh bien oui, il y a un écart de temps peut-être une seconde, mais à ce moment-là, aucun utilisateur n'ouvrira une autre instance de mot.
Je pense toujours que c'est une solution peu fiable. Cela fonctionne bien pour les petits projets que vous faites à la maison, mais ne doit pas être utilisé dans une sorte de contexte industriel et votre deuxième phrase indique clairement pourquoi.
Si vous souhaitez fermer l'application Word entièrement, vous pouvez simplement appeler: