【问题标题】:Identify process id of word instance using System.Diagnostics.Process object使用 System.Diagnostics.Process 对象识别单词实例的进程 ID
【发布时间】:2013-12-04 13:54:17
【问题描述】:

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

【问题讨论】:

  • 当我执行你的代码时,Word 没有启动?
  • 它只是一个 sn-p.. 不是完整的代码。
  • 好的,你试过Process.MainWindowTitle吗?
  • 希望这对你有用:stackoverflow.com/questions/814936/…
  • 我试过 MainWindowtitle。它是空的。我们的代码与此处的代码相同(stackoverflow.com/questions/814936/…)但它在 windows server 2008 上中断。在 server 2003 上工作正常。

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


【解决方案1】:

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

但有一些限制:

  1. 当您使用新的 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;
    }

【讨论】:

    【解决方案2】:

    那怎么样(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。

    【讨论】:

    • 我可以使用此代码获取进程 ID。但是 GetActiveObject 引发以下异常 System.Runtime.InteropServices.COMException 未处理 Message="操作不可用(来自 HRESULT 的异常:0x800401E3 (MK_E_UNAVAILABLE))" Source="mscorlib" ErrorCode=-2147221021 StackTrace:在 System.Runtime.InteropServices .Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk) at System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
    猜你喜欢
    • 2012-06-20
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2014-05-10
    • 2011-05-05
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多