使用System.Diagnostics.Process对象标识单词实例的进程ID

时间:2013-12-04 13:54:18

标签: c# ms-word system.diagnostics word-automation word-automation-service

我有启动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的正确实例?

2 个答案:

答案 0 :(得分:0)

您可以使用Process.MainWindowTitle属性判断进程是否在您的代码中。

但是有一些限制:

  1. 使用新的Microsoft.Office.Interop.Word.Application()时,默认情况下不会显示单词windows。当它被隐藏时,Process.MainWindowTitle为空。因此,在获得Pid之前,您可以将其设置为可见。

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

  3. 这是我的代码:

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

答案 1 :(得分:-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。