我正在使用Office互操作创建一个新的Word实例,方法如下:
var word = Microsoft.Office.Interop.Word.Application();
word.Visible = true;
word.Activate;我可以像这样得到一个窗口句柄:
var wordHandle = Process.GetProcessesByName("winword")[0].MainWindowHandle;问题是,代码的工作原理是假设没有其他Word实例在运行。如果有多个,它不能保证返回的句柄是我启动的实例的句柄。在检测到来自我的对象的WindowActivate事件后,我尝试使用GetForegroundWindow,但这都是在一个设置为作为最顶层窗口运行的WPF应用程序中运行的,所以我只获得了WPF窗口的句柄。有没有其他方法来获得我的word实例的句柄?
发布于 2011-12-30 06:33:20
您已经获得了所有Word进程的列表。您可以遍历此列表,获取每个进程的父ID,并匹配当前进程,即创建Word实例的您自己的应用程序。这大致是我的想法:
IntPtr getChildProcess(string childProcessName)
{
var currentProcess = Process.GetCurrentProcess();
var wordProcesses = Process.GetProcessesByName(childProcessName);
foreach (var childProcess in wordProcesses)
{
var parentProcess = ProcessExtensions.Parent(childProcess);
if (currentProcess.Id == parentProcess.Id)
return currentProcess.Handle;
}
return IntPtr.Zero;
}this excellent response中的ProcessExtensions类在之前的文章中可用。我在自己的代码中使用了这个类,没有收到任何抱怨。
https://stackoverflow.com/questions/8673726
复制相似问题