创建一个虚拟HWND以传递给Direct3D

时间:2013-01-29 21:39:57

标签: c# c++ directx sharpdx

我正在尝试使用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项目。

1 个答案:

答案 0 :(得分:2)

IDirect3D9Ex::CreateDeviceEx的文档说明HWND参数是可选的,如果您处于窗口模式且HWND结构中的演示文稿D3DPRESENT_PARAMETERS设置为(已故)编辑:oops,不能为空)

来自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

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

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