我有如下代码可启动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的正确实例?
您可以使用Process.MainWindowTitle属性来判断该过程是否由您的代码决定。
但是有一些限制:
当您使用新的Microsoft.Office.Interop.Word.Application()时,默认情况下不显示单词windows。隐藏时,Process.MainWindowTitle为空。因此,您在获得Pid之前将其设置为可见。
打开文档后,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;
}
感谢这对我有用。我使用了相同的方法,并且能够从对象中获取单词process的PID。
那(unestet):
更新
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。