Я создаю новый экземпляр Word с помощью взаимодействия с Office, выполнив следующие действия:
var word = Microsoft.Office.Interop.Word.Application();
word.Visible = true;
word.Activate;
Я могу получить дескриптор окна вроде этого:
var wordHandle = Process.GetProcessesByName("winword")[0].MainWindowHandle;
Проблема в том, что код работает в предположении, что другой экземпляр Word не запущен. Если их несколько, нельзя гарантировать, что возвращаемый дескриптор относится к экземпляру, который я запустил. Я пробовал использовать GetForegroundWindow
после обнаружения события WindowActivate
от моего объекта, но все это выполняется в приложении WPF, которое настроено на запуск как самое верхнее окно, поэтому я просто получаю дескриптор в окно WPF. Есть ли другие способы получить дескриптор моего экземпляра слова?
Начиная с Word 2013 можно использовать Hwnd
свойство Window
, который выставляется от Application
var windowHandle = wordApplication.ActiveWindow.Hwnd;
, Hwnd возвращает Целое число, которое указывает на дескриптор окна указанного окна. С этим int
можно использовать NativeWindow
, который обеспечивает инкапсуляцию низкого уровня дескриптора окна.
var nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(new IntPtr(windowHandle));