Ответ 1
Для Process.MainWindowHandle, конечно, не редкость возвращать неправильный дескриптор. Класс Process должен угадать, какое окно является "основным". В native winapi нет механизма для обозначения окна как такового. Поэтому Process делает предположение, что первое окно является основным. Это может привести к ошибкам в приложениях, которые используют заставку или диалог входа в систему, и т.д., Или создать окно в другом потоке.
Application.OpenForms не имеет этой проблемы, но имеет режим сбоя, он потеряет отслеживание окна при его воссоздании. Это происходит, когда программа меняет некоторые свойства формы, которые могут быть указаны только при создании окна. Свойства ShowInTaskbar, TransparencyKey и Opacity являются наиболее распространенными нарушителями спокойствия.
Самый надежный способ - переопределить метод OnHandleCreated() формы, в которой вы хотите быть родителем. Которое вызывается всякий раз, когда изменяется свойство Handle. Обратите внимание, что вы хотите убедиться, что этого не происходит, пока окно WPF активно, что также приведет к удалению окна WPF. В противном случае легко заметить, конечно:)
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
SetWpfInteropParentHandle(this.Handle);
}