none
WPF中如果获取UserControl的句柄 RRS feed

  • 问题

  • 在wpf中如何获取UserControl的句柄呢,我通过下面代码获取到的是我主窗体(MainWindown)的句柄:

    ps:  this 是我自定义的UserControl控件

    _hwnd = PresentationSource.FromVisual(this) as HwndSource;
    //MessageBox.Show(this._hwnd.RootVisual.ToString());

    => 求解? 有什么好的方法可以获取UserControl的句柄(因为需要做一个将外部程序嵌入到我UserControl的应用,所以需要句柄)


    2013年4月27日 7:36

答案

  • 此问题就是经典的AirSpace问题,目前没有解决方法,为了防止屏幕资源被跨技术访问产生冲突(因为WPF的内容可以是半透明的),所以只能强制嵌入GDI/DX的内容永远置顶。 相关解释:http://msdn.microsoft.com/zh-cn/library/aa970688.aspx

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 AndyWyg 2013年4月28日 3:02
    2013年4月28日 2:14
    版主

全部回复

  • WPF 只有窗体有句柄,为什么呢?

    WPF基于Direct2D技术渲染其界面和控件,而不是传统的GDI方式,理论上 DX渲染的对象是没有句柄概念的,但是因为WPF的内容总要有个窗体放置,且这个窗体需要和Windows GDI的内容交互,所以在WPF的窗体外面就有了一个 叫做 “HwndWrapper” 的封装(你可以在SPY++中看到),我们所拿到的句柄其实只是这个封装的句柄。  

    所以给你的答案是你是拿不到UserControl和任何WPF内部控件内容的句柄的。

    我以前的相类似答复:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cc61ed2d-2370-40f8-92a9-032432ae10e4/

    对于你的需求,你可以在WPF中放置一个WindowsFormHost 这个元素是可以呈现GDI内容的,而且他也有句柄。

    参考下面两个 演练:


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年4月28日 1:55
    版主
  • 我今天调试结果也是这样的,所以我改用新的方法实现了,通过继承HwndHost来实现在usercontrol中嵌入win32 程序~ 目前程序运行正常,也基本达到了我们的要求但是出现了一个问题,被嵌入的win32程序永远是置顶的,会遮盖了其他了WPF控件,以前我在wpf中嵌入activeX控件时候也有过类似的问题,但是一直都没有得到解决,不知道你什么好的建议吗? 
    2013年4月28日 2:02
  • 此问题就是经典的AirSpace问题,目前没有解决方法,为了防止屏幕资源被跨技术访问产生冲突(因为WPF的内容可以是半透明的),所以只能强制嵌入GDI/DX的内容永远置顶。 相关解释:http://msdn.microsoft.com/zh-cn/library/aa970688.aspx

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    • 已标记为答案 AndyWyg 2013年4月28日 3:02
    2013年4月28日 2:14
    版主