1

我有启动 Word 应用程序实例的代码,如下所示

Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
app.Caption = "abcd_" + DateTime.Now.Ticks.ToString();

我现在需要知道已启动的单词实例的进程 ID。我不能使用 FindWindow 来获取窗口句柄和 GetWindowThreadProcessId 来从句柄中获取进程 ID,因为代码在 Windows Server 2008 上不起作用。

我使用Process.GetProcessesByName("WINWORD")获得所有文字处理。Process 是否有任何属性可以为我提供我们在 app.Caption 中设置的值?如果没有,我是否可以设置 Word.Application 的任何其他属性,然后再从 Process 数组中读取以识别 Word 的正确实例?

4

2 回答 2

0

您可以使用 Process.MainWindowTitle 属性来判断进程是否由您的代码执行。

但是有一些限制:

  1. 当您使用 new Microsoft.Office.Interop.Word.Application() 时,word windows 默认是不可见的。当它被隐藏时, Process.MainWindowTitle 是空的。因此,您在获得 Pid 之前将其设置为可见。

  2. 打开文档后,MainWindowTitle 将更改为文档的文件名。

这是我的代码:

    static void Main(string[] args)
    {
        string uniCaption = Guid.NewGuid().ToString();
        Word.Application oWordApp = new Word.Application();
        oWordApp.Caption = uniCaption;
        oWordApp.Visible = true;

        Process pWord = getWordProcess(uniCaption);

        //If you don't want to show the Word windows
        oWordApp.Visible = false;

        //Do other things like open document etc.
    }

    static Process getWordProcess(string pCaption)
    {
        Process[] pWords = Process.GetProcessesByName("WINWORD");
        foreach (Process pWord in pWords)
        {
            if (pWord.MainWindowTitle == pCaption)
            {
                return pWord;
            }
        }

        return null;
    }
于 2014-10-07T20:51:23.117 回答
-1

那怎么样(untestet):

更新

Word.Application wdapp;
try 
{     
    Process wordProcess = System.Diagnostics.Process.Start("Path to WINWORD.EXE");
    wdApp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
} 
catch (COMException) 
{
     Type type = Type.GetTypeFromProgID("Word.Application");
     wdapp = System.Activator.CreateInstance(type);
 } 

wdApp应该是开始的词。你通过wordProcess实例获取进程ID。

于 2013-12-05T09:48:06.660 回答