如何使用HwndSource

HCL*_*HCL 5 .net c# wpf winapi

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

HwndSource source = (HwndSource)HwndSource.FromVisual(Window.GetWindow(this));
var certificates= X509Certificate2UI.SelectFromCollection(...,source.Handle);
Run Code Online (Sandbox Code Playgroud)

到目前为止,这很好.我的问题是,因为我对Win32或互操作没有太大的了解,如果我必须在此之后做一些清理代码,或者如上所述使用HwndSource类有一些陷阱?

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

Roh*_*ats 5

WPF窗口由两部分组成:

  • 窗口区域由操作系统窗口组成
  • 非窗口区域,位于WPF窗口内

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

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

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

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