Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建要传递给Direct3D的虚拟HWND_C#_C++_Directx_Sharpdx - Fatal编程技术网

C# 创建要传递给Direct3D的虚拟HWND

C# 创建要传递给Direct3D的虚拟HWND,c#,c++,directx,sharpdx,C#,C++,Directx,Sharpdx,我正试图用SharpDX把这个函数翻译成纯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 invis

我正试图用SharpDX把这个函数翻译成纯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项目。

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

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

要获得一个窗口句柄以供使用,您可以通过常规的.NET framework方法创建另一个顶级窗口,并获取其窗口句柄,而无需通过Win32方法调用进行操作

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

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



您可以考虑从<代码> CreateWindowEx < /COD> >虚拟Windows窗体/USER控件不会做这项工作吗?它们应该有一个手柄。不清楚为什么要使用虚拟窗口。只需使用在WPF中创建的常规窗口。使用WindowInteropHelper.Handle属性。@HansPassant,因为我链接到的MSDN示例说明:“一般来说,您创建了一个供Direct3D9使用的虚拟HWND。”我刚刚做了一些测试,很明显,它甚至可以在没有任何HWND的情况下工作,无论是创建DeviceEx还是在PresentParams中。我能够以这种方式实例化几个独立的设备。因此,在这一点上,我想知道为什么MSDN示例建议创建一个指向Direct3D的虚拟HWND,或者它应该实现什么。Vista和更高版本似乎不需要HWND,但在没有HWND的Windows XP中,调用将失败。