8

非常によく似たスレッドがいたるところにたくさん見られましたが、非常に基本的な解決策を提供してくれるものは何もないようです。

私の winforms アプリケーションから、(アプリケーション自体から開かれた) Word ドキュメントの実行中のインスタンスを閉じる必要があります。アプリケーションからワード文書を開くと、それをリストで追跡します。どうすれば同じドキュメントを閉じることができますか?

これが私が試したものです:

private bool CloseWord(string osPath) //here I pass the fully qualified path of the file
{
    try
    {
        Word.Application app = (Word.Application)Marshal.GetActiveObject("Word.Application");
        if (app == null)
            return true;

        foreach (Word.Document d in app.Documents)
        {
            if (d.FullName.ToLower() == osPath.ToLower())
            {
               d.What? //How to close here?
               return true;
            }
        }
        return true;
    }
    catch
    {
        return true;
    }
}

.Close()ドキュメントオブジェクトのメソッドはたくさんありますが、次のような引数を持つ to closeだけref object SaveChanges, ref object OriginalFormat, ref object RouteDocumentです。これは理解できません。

理想のやり方とは?ありがとう..

編集:

  1. ユーザーが他の Word ファイルを開いている可能性があるため、Word アプリケーション (WinWord) 全体を閉じることができません。

  2. Process.Kill()ユーザーに保存するかどうかなどのプロンプトを表示せずに、インスタンスという単語(のようなもの)を終了する必要があります。

4

4 に答える 4

17

ここから得たこの解で解けます。

Word.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
    return true;

foreach (Word.Document d in app.Documents)
{
    if (d.FullName.ToLower() == osPath.ToLower())
    {
        object saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;
        object originalFormat = Word.WdOriginalFormat.wdOriginalDocumentFormat;
        object routeDocument = false;
        d.Close(ref saveOption, ref originalFormat, ref routeDocument);
        return true;
    }
}
return true;
于 2011-09-16T15:01:30.470 に答える
2

次のようなものを使用するのはどうですか:

変更元: http://www.dreamincode.net/code/snippet1541.htm

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;
}
于 2011-09-16T14:22:59.883 に答える
1

手遅れであることはわかっていますが、同じ問題があったため、このトピックを見つけました。

そして、私の解決策は他の人を助けるかもしれません。

上記のソリューションは、Word の実行中のすべてのインスタンスを強制終了したため、うまく機能しませんでしたが、c# プログラムではなくユーザーによって開かれました。

したがって、これはそれほどユーザーフレンドリーではありませんでした。

私のコードは、C# でオブジェクトを作成する前後のプロセスをチェックし、プロセスのWord.ApplicationID を書き込み、 両方の値を比較します。両方でaが見つからない場合、この ID を持つプロセスを強制終了します。WINWORDList<int>List<int>processIDList<int>

public List<int> getRunningProcesses()
{
    List<int> ProcessIDs = new List<int>();
    //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;             
        if (clsProcess.ProcessName.Contains("WINWORD"))
        {
            ProcessIDs.Add(clsProcess.Id);
        }
    }
    return ProcessIDs;
}

これを 2 回実行します (Word.Application の作成前と作成後に 1 回)。

 List<int> processesbeforegen = getRunningProcesses();
 // APP CREATION/ DOCUMENT CREATION HERE...
 List<int> processesaftergen = getRunningProcesses();

次に実行しますkillProcesses(processesbeforegen, processesaftergen);

 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();
        }
    }
 }
于 2012-11-14T08:53:07.217 に答える
1

アプリケーション全体を閉じたい場合は、次のように呼び出すことができます。

Word.Application app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
if (app == null)
    return true;
app.Quit(false);
于 2016-11-11T08:03:36.653 に答える