如何使用HwndSource

时间:2011-11-10 16:31:23

标签: c# .net wpf winapi

在我的WPF应用程序中,我必须让用户选择证书。我通过X509Certificate2UI.SelectFromCollection方法执行此操作。为了正确对话处理,SelectFromCollection方法需要父Hwnd的IntPtr。我找到了以下代码来提供这个:

HwndSource source = (HwndSource)HwndSource.FromVisual(Window.GetWindow(this));
var certificates= X509Certificate2UI.SelectFromCollection(...,source.Handle);

到目前为止,这个工作正常。我的问题是,因为我对Win32或互操作没有太大的了解,如果我必须在此之后做一些清理代码,或者如果我像上面那样使用HwndSource类有一些陷阱?

我已经看到HwndSource实现了IDisposable,但在使用后处理对象会关闭父窗口。因此,这似乎不是预期用途。

1 个答案:

答案 0 :(得分:5)

WPF窗口由两部分组成:

  • 由操作系统窗口
  • 组成的窗口区域
  • WPF窗口内的非窗口区域

现在,作为ContentControl的WPF窗口将所有内容都保存为其内容。因此,您可以说Window类中的Content的每个像素都由Outside窗口保存。 WPF的每个Visual都没有与之关联的HANDLE,而是外部窗口元素的内容。

有关详细信息,请参阅此内容 - http://www.abhisheksur.com/2010/12/win32-handle-hwnd-wpf-objects-note.html

因此,当您处理该句柄时,实际上是在处理主窗口处理程序,导致完全应用程序关闭。

因此,你只是在这里取得你的窗口处理程序,而不是创建你可能需要处理的任何东西.. !!