【问题标题】:Creating a dummy HWND to pass to Direct3D创建一个虚拟 HWND 以传递给 Direct3D
【发布时间】:2013-01-29 21:39:57
【问题描述】:

我正在尝试使用 SharpDX 将 D3DImage sample 转换为纯 C#。 Direct3D 需要一个 HWND 来初始化,这就是它在 C++ 中的完成方式:

WNDCLASSEX g_wc = { sizeof(WNDCLASSEX), CS_CLASSDC, nullptr, 0L, 0L,
      GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"Foo", nullptr };
HWND g_windowHandle;

// Create invisible window to get HWND
RegisterClassEx(&g_wc);
g_windowHandle = CreateWindow(L"Foo", L"Foo", WS_OVERLAPPEDWINDOW, 
    0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr);

    // then eventually we can create the device
Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
m_d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_windowHandle,
    vertexProcessing | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
    &d3dpp, nullptr, &m_d3dDevice);

在 C# 中获得这个虚拟 HWND 的最佳方法是什么?它必须不同于主窗口的 HWND。我的应用程序是一个 WPF 项目。

【问题讨论】:

  • 你可以考虑从CreateWindowEx开始
  • 虚拟窗体窗体/用户控件不能完成这项工作吗?他们应该有一个句柄。
  • 不清楚为什么要使用虚拟窗口。只需使用您在 WPF 中创建的常规窗口即可。使用 WindowInteropHelper.Handle 属性。
  • @HansPassant 因为这就是我链接到的 MSDN 示例所说的:“通常,您创建一个虚拟 HWND 供 Direct3D9 使用。”

标签: c# c++ directx sharpdx


【解决方案1】:

IDirect3D9Ex::CreateDeviceEx 的文档说HWND 参数是可选的,如果您处于窗口模式并且您的演示文稿HWND 在您的D3DPRESENT_PARAMETERS 结构中设置(后期编辑:哎呀,不能空白)

来自IDirect3D9Ex::CreateDeviceEx @ MSDN

hFocusWindow [in]
类型:HWND
当应用程序从前台模式切换到后台模式时,焦点窗口会向 Direct3D 发出警报。对于全屏模式,指定的窗口必须是顶级窗口。对于窗口模式,仅当 pPresentationParameters 的 hDeviceWindow 成员设置为有效的非 NULL 值时,此参数才可能为 NULL。

D3DPRESENT_PARAMETERS struct @ MSDN

要获得一个窗口句柄以供使用,您可以通过常规 .NET 框架方法创建另一个顶级窗口并获取它的窗口句柄,而不是通过 Win32 方法调用进行动作。

如果您发现无法使用 WPF 提供的句柄(根据 Hans Passant 的评论),您还可以制作一个虚拟的 Windows 窗体并将其实例化为隐藏窗口,并改用其句柄。

WindowInteropHelper (WPF) @ MSDN

Control.Handle (Windows Forms) @ MSDN

脚注:您现有的 WPF 主窗口句柄可能没问题,除非 SharpDX 或现有 Viewport3D 中的某些机制与以这种方式使用 Direct3D9 有冲突。

3-D Graphics Overview (WPF) @ MSDN
Viewport3D Class (WPF) @ MSDN

【讨论】:

  • 我刚刚做了一些测试,显然即使在没有任何 HWND 的情况下它也可以工作,无论是对 CreateDeviceEx 还是在 PresentParams 中。我能够以这种方式实例化几个独立的设备。所以在这一点上,我想知道为什么 MSDN 示例建议为 Direct3D 创建一个虚拟 HWND,或者它应该实现什么。
  • Vista 及更高版本似乎不需要 HWND,但在没有 HWND 的 Windows XP 中调用将失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2014-07-20
  • 2015-03-12
相关资源
最近更新 更多