我正在使用一些代码,这些代码使用 Microsoft.WindowsAPICodePack 来提供 Vista 风格的通用对话框 ( IFileOpenDialog
, IFileSaveDialog
) 的 C# 包装器。我想在OnFileOk
事件回调中添加对所选项目的验证,这主要是有效的,但它的一个方面是提取对话框的 HWND 以用作显示的消息框的父级。Microsoft 提供了有关如何执行此操作的文档:
调用进程可以使用对话框本身的窗口句柄作为 UI 的父级。可以通过首先调用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
(我最近没有对 COM 互操作做太多工作,但这包含了QueryInterface
底层 COM 世界中的调用,对吗?),没有发生错误,并且IOleWindow
引用不是null
. 但是,当我打电话时GetWindow
,它似乎总是返回IntPtr.Zero
。我尝试用out
参数而不是返回值声明方法,并得到相同的结果:没有错误,但总是IntPtr.Zero
.
有没有人看到我做错了什么?我没有做错什么,但有时你不能得到一个窗口句柄?