Я работаю с некоторым кодом, который использует Microsoft.WindowsAPICodePack для предоставления оболочки C # для общих диалогов в стиле Vista (IFileOpenDialog
, IFileSaveDialog
).Я хочу добавить проверку выбранного элемента в обратном вызове события OnFileOk
, и это в основном работает, но один из аспектов этого заключается в извлечении HWND диалога для использования в качестве родителя для отображаемого окна сообщения,Microsoft предоставляет документацию о том, как это сделать:
Вызывающий процесс может использовать дескриптор окна самого диалога в качестве родителя пользовательского интерфейса.Этот дескриптор можно получить, сначала вызвав IOleWindow :: QueryInterface , а затем вызвав IOleWindow :: GetWindow с дескриптором, как показано в этом примере.
(https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913(v=vs.85).aspx)
Я добавил определение кода IOleWindow
к коду:
[ComImport,
Guid(ShellIIDGuid.IOleWindow),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IOleWindow
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void ContextSensitiveHelp(
[In] bool fEnterMode);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
IntPtr GetWindow();
}
...
internal const string IOleWindow = "00000114-0000-0000-C000-000000000046";
Когда я приводил IFileDialog
, переданный в OnFileOk
в IOleWindow
(Iв последнее время не так много работали с COM-взаимодействием, но это оборачивает вызов QueryInterface
в базовом мире COM, верно?), ошибки не возникает, и ссылка IOleWindow
не является null
. Но когда явызов GetWindow
, кажется, он всегда возвращает IntPtr.Zero
. Я попытался объявить метод с параметром out
вместо возвращаемого значения и получить тот же результат: без ошибок, но всегда IntPtr.Zero
.
Кто-нибудь видит, что я делаю неправильно? Я не делаю ничего плохого, но просто иногда вы не можете получить дескриптор окна ??