Установить владельца OpenFileDialog из дескриптора окна

Я хотел бы установить владельца OpenFileDialog (в пространстве имен Microsoft.Win32, а не System.Windows.Forms), но у меня есть только дескриптор (IntPtr) окна (дескриптор не обязательно должен быть из моего приложения, он может быть внешним).

Возможно ли это или я вынужден использовать OpenFileDialog от System.Windows.Forms?

Я хочу иметь эффект вызова

protected abstract bool RunDialog(IntPtr hwndOwner);

внутри базового класса CommonDialog, но он защищен. Есть ли обходной путь? Могу ли я использовать отражение, чтобы получить этот метод и выполнить его, или есть более чистый способ сделать это?

Обычный метод ShowDialog() допускает только Window, чего у меня нет.

Я использую этот код, чтобы установить владельца другого окна, когда у меня есть только дескриптор, но конструктор WindowInteropHelper принимает только Window, а CommondDialog не наследуется от Window:

Window window;
IntPtr ownerHwnd;
var wih = new WindowInteropHelper(window);
wih.Owner = ownerHwnd;

person Rand Random    schedule 06.07.2015    source источник
comment
Я думаю, что вы набиты, так как диалоги запечатаны, поэтому вы даже не можете извлечь из них и внедрить свой собственный дескриптор при вызове RunDialog. Версии WinForms содержат одни и те же собственные диалоги, так что это, вероятно, лучший вариант.   -  person Charles Mager    schedule 06.07.2015
comment
Вы можете обмануть и использовать MethodInfo.Invoke() для запуска RunDialog. Попытки избежать версии winforms не очень полезны.   -  person Hans Passant    schedule 08.07.2015


Ответы (1)


Я подозреваю, что этот вопрос по-прежнему является дубликатом некоторого вопроса о переполнении стека, но при быстром поиске я не нашел очевидного близкого кандидата. Так

Вы можете получить объект WPF Window, приведя значение свойства RootVisual HwndSource к Window:

Window IntPtrToWindow(IntPtr hwnd)
{
    HwndSource hwndSource = HwndSource.FromHwnd(hwnd);

    return (Window)hwndSource.RootVisual;
}

См. Класс HwndSource для более подробной информации.

person Peter Duniho    schedule 08.07.2015
comment
Это работает с внешними hwnds? Так, например, я пишу надстройку для программы чтения PDF (или другой произвольной программы) и вызываю свой метод C# с этим кодом. Действительно ли я получаю объект окна WPF? - person Rand Random; 08.07.2015
comment
Это зависит от того, что вы подразумеваете под внешним. Конечно, это должно работать для любого HWND из того же процесса. Совместное использование дескрипторов между процессами может быть сложным, но если у вас есть действительный HWND, который вы могли бы использовать в противном случае (например, отправлять сообщения), он, вероятно, будет работать и там. Хотя достаточно легко, чтобы вы попробовали. - person Peter Duniho; 08.07.2015
comment
Попробую, спасибо за ответ, когда-нибудь вернусь. И да, я имел в виду из разных процессов. - person Rand Random; 08.07.2015