我的单词加载程序中有许多WPF对话框。对于其中一个(只有一个,奇怪的是),在打开时有时不会集中注意力。我相信我需要设置其父母。
我知道有一种方法可以将WPF窗口的所有者设置为HWND,但是有什么方法可以在Word 2010中获得HWND?我找到了这个HWND属性,但它是Word 2013及以后的。除了使用GetForeGroundWindow()以外,还有其他方法可以获取Word的HWND。
我发现使用Office Interop获取特定窗口句柄有用。但是所有这些答案都是基于获取您新创建的窗口的手柄。我对其进行了一些修改以获取现有窗口,并将其塞入实用方法中。
doc
是当前文档。
using System.Windows.Interop;
using System.Diagnostics;
public void SetOwner(System.Windows.Window pd)
{
var wordProcs = Process.GetProcessesByName("winword").ToList();
// in read-only mode, this would be e.g. "1.docx [Read-Only] - Microsoft Word"
var procs = wordProcs.Where(x =>
x.MainWindowTitle.StartsWith(Path.GetFileName(doc.FullName))
&&
x.MainWindowTitle.EndsWith("- Microsoft Word"));
if (procs.Count() >= 1)
{
// would prefer Word 2013's Window.HWND property for this
var handle = procs.First().MainWindowHandle;
WindowInteropHelper wih = new WindowInteropHelper(pd);
wih.Owner = handle;
}
}
不幸的是,似乎不可能考虑具有相同文档名称的多个窗口(在不同的文件夹中),因为过程的数量永远不会大于1。但是我认为这是可以接受的限制。