2016-06-16 4 views
0

У меня есть несколько диалоговых окон WPF в моей надстройке Word. Для одного из них (и только одного, как ни странно), он иногда не фокусируется при открытии. Я считаю, что мне нужно установить родителя.Получить дескриптор окна Word для использования с окнами WPF

Я знаю, что есть a way to set the owner of a WPF window to a HWND, но есть ли способ получить HWND в Word 2010? Я нашел this HWND property, но это только Word 2013 и позже. Есть ли другой способ получить HWND Word, кроме использования GetForegroundWindow(), который не гарантирует дескриптор окна, которое я действительно хочу (или любой другой подобный kludge)?

ответ

0

Я нашел что-то полезное в Get specific window handle using 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. Но я думаю, что это приемлемо ограничение ,