8
votes

Comment fermer une instance de fonctionnement de documents Word? (C #)

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?

Voici ce que j'ai essayé: xxx

i obtenir beaucoup de méthodes pour l'objet de document, mais seulement un .close () < / Code> Pour fermer Qui a des arguments comme celui-ci: Object SAVECHANGES, REF Object OriginalFormat, Ref Object RoudeDocument Ce que je ne comprends pas.

Quel est le moyen idéal? Merci ..

EDIT:

  1. Je ne peux pas fermer l'ensemble de l'application Word (WinWork) car les utilisateurs peuvent avoir d'autres fichiers Word ouverts.

  2. Je dois simplement mettre fin à l'instance de mot (quelque chose comme processus.kill () ) sans aucune invite à l'utilisateur à sauvegarder ou non.


0 commentaires

4 Réponses :


2
votes

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;
}


1 commentaires

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é.




1
votes

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 mot.aapplication code> objet en C # et écrit les identifiants des processus code> winword code> dans la liste code> Ensuite, il compare les valeurs de la liste code>. Quand un processID code> est introuvable dans la liste code> Il tue le processus avec cet ID. P>

 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();
        }
    }
 }


3 commentaires

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.



1
votes

Si vous souhaitez fermer l'application Word entièrement, vous pouvez simplement appeler: XXX


0 commentaires