【问题标题】:Handle to Silverlight UserControlSilverlight 用户控件的句柄
【发布时间】:2011-06-12 06:51:10
【问题描述】:

我有一个用 C++ 编写的 DLL (Player.dll),它在内部使用 Windows GDI。我有一个用 Windows 窗体编写的应用程序(基本上是一个视频播放器),它在内部调用来自 Player.dll 的 API 以使用 p/invoke 技术在屏幕上呈现 实际 图形:

public class ProxyPlayer
{
    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")]
    public static extern void Play(int playerHandle, out TWResult result);

    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")]
    public static extern void Pause(int playerHandle);

    //other methods
}

它正在工作。

但是现在,我想使用 Silverlight 4.0 编写相同的应用程序。如您所知,大多数Windows GDIHWND 一起在屏幕上渲染图形,这就是我将playerHandle 传递给ProxPlayer 方法的原因,正如您在上面看到的那样。 Window Forms 的UserControl 定义了一个名为Handle 类型为IntPtr 的公共属性,它相当于HWND,所以我将它传递给ProxyPlayer 方法。它解决了我的问题。但 Silverlight 的 UserControl 没有任何此类属性。

所以我的问题基本上是,我将如何处理我的 silverlight 控件?因为没有它,我无法从Player.dll 调用API。但我必须从中调用 APS。我没有任何其他选择,因为 DLL 是真正的引擎,它执行与解释大量数据相关的所有事情,然后渲染它们。因此,请向我推荐符合我要求的解决方案!

注意:假设我的 silverlight 应用程序将始终在 Microsoft Windows 上运行。所以我在调用 Windows GDI 时没有问题。

【问题讨论】:

  • Silverlight 的用户控件没有句柄(与 WPF 相同)。对于 WPF,主窗口有一个,但即使在 Silverlight 中也不是这样,其中内容由其他应用程序(浏览器或 sllauncher)托管
  • @Nawaz:你有没有找到解决问题的方法?我需要和你一样!
  • @Johannes:不。我没有尝试那么多,因为我有一个简单的替代方案:我部署了我的播放器(即作为 winform 应用程序)并要求用户下载它以便播放视频文件。

标签: c# winforms silverlight silverlight-4.0 pinvoke


【解决方案1】:

我有一个用 C++ 编写的 DLL (Player.dll),内部使用了 win32 API

您可以简单地将 PInvoking 忘记到 Silverlight 中的类似内容。 Silverlight 旨在跨浏览器/平台运行。所以想象一下你在 MacOS 下的代码。因此,请将您的精力集中在搜索可以从 Silverlight 运行的此代码的托管等效项上,否则您只是在浪费时间。

【讨论】:

  • @Darin:我已经更新了我的问题。请看底部的“注意”
  • +1 - Silverlight 已经提供了大量的媒体支持(请参阅 MediaElement 控件) - 那么为什么还要再搞乱 HWND 呢?特别是在跨平台插件中? Silverlight 甚至可以使用 DirectX 或 OpenGL(取决于平台)对某些事物进行硬件加速,这将优于基于 HWND 的渲染。为什么不让平台做它最擅长的事情并进行渲染?
  • @Austin:实际上我需要从 DLL 调用方法,因为我需要处理窗口。我没有其他选择。 C++ DLL 是真正的引擎,可以完成与渲染相关的所有事情。你有什么解决办法吗?
  • @Nawaz,PInvoke 仅在浏览器外模式下工作。您的应用程序打算这样运行吗?如果是,为什么不考虑使用 WPF?
  • @Nawaz - 您可以使用 XBAP 在使用 WPF 的浏览器中运行。我认为您希望 Silverlight 成为 WPF,但它故意不是 - 毕竟,我们已经有了 WPF。 Silverlight 旨在跨平台(并在浏览器的安全沙箱等中运行),因此这种支持在平台上是故意不可用的。
【解决方案2】:

如果您可以将您的本机 DLL 公开为实现 IDispatch 的 COM 服务器,如果您在 Windows 上的浏览​​器外受信任应用程序中,则可以从 Silverlight(通过 AutomationFactory 类)访问它。

我仍然建议您(根据我对 Darin 的回答的评论)好好看看该平台,因为您的“PlayVideo”/“PauseVideo”示例表明您正在尝试做该平台可能已经做的事情 - 并且更好的是,该平台可以在 MacOS 和浏览器中完成,而无需编写自己的 COM 服务器等丑陋的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2014-04-07
    • 2023-03-30
    • 1970-01-01
    • 2010-10-31
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多