我已经使用SlimDX在c#中编写了基于Direct3D 9的渲染引擎。在一个新项目中,我现在需要使用web服务分发加载的3D场景的图片。问题是,为了渲染任何东西,我需要一个Direct3d设备。没有用户登录到系统并且桌面未被锁定的情况下,是否有任何方法可以创建direct3d设备?在锁定的系统上渲染3D场景
如果这是不可能的,是否有人知道解决方法?最后,我需要一个可以从任务计划器使用某个本地用户帐户或服务运行的可执行文件,该文件定期从某些视点呈现场景图片。
引擎分为两部分:引擎本身和渲染器。因此,如果没有其他方法,那么我也可以使用opengl或任何其他允许渲染而不具有可见形式的技术来实现新的渲染器。
编辑:
我到目前为止是这样的:
protected override void OnContinue() {
base.OnContinue();
NativeFunctions.SafeWindowStationHandle hwinsta = NativeFunctions.WindowStation.OpenWindowStation(
"WinSta0",
true,
NativeFunctions.AccessMask.WINSTA_ALL_ACCESS);
if(hwinsta == null || hwinsta.IsClosed || hwinsta.IsInvalid)
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
if(NativeFunctions.WindowStation.SetProcessWindowStation(hwinsta.DangerousGetHandle())) {
NativeFunctions.SafeDesktopHandle ptrDesktop = NativeFunctions.WindowStation.OpenInputDesktop(
0,
true,
NativeFunctions.AccessMask.DESKTOP_CREATEWINDOW);
if(ptrDesktop.IsClosed || ptrDesktop.IsInvalid)
return;
if(!NativeFunctions.WindowStation.SetThreadDesktop(ptrDesktop.DangerousGetHandle()))
return;
Log log = Logger.Instance.CreateLog("DXService", true, true, false);
log.LogMessage("Desktop set, creating D3D-Object.", LOGMESSAGELEVEL.CRITICAL, true);
Direct3D direct3D = new Direct3D();
log.LogMessage("Direct3D object created, creating device.", LOGMESSAGELEVEL.CRITICAL, true);
if(direct3D.AdapterCount == 0) {
log.LogMessage("FATAL: direct3D.AdapterCount == 0");
}
}
}
这是一个最小的WindowsService的一部分。我将重要代码放入OnContinue函数中,因为它比启动代码更易于调试。我赋予这项服务与活动桌面交互的权利。当我运行服务作为本地系统帐户获取桌面和windowstation的工作,但GraphicsAdapter的数量仍然是0,当我运行服务使用专用的用户帐户,然后我甚至不能打开WindowStation。还有什么我可以尝试或我做错了什么?我在Windows 7机器上测试了这一点,而我登录了,否则调试变得非常困难。可能这是一个问题?
感谢
非常感谢Window Stations的提示,您是否可以尝试记住一些必要的操作,因为这样做几乎正是我所需要的。从我目前阅读的内容来看,我需要将我的应用程序作为服务来运行,并有权访问交互式桌面(安全漏洞),然后以某种方式我应该能够创建一个有效的设备。但是,如何? ;) – Gooo 2011-05-17 07:41:49
对不起,这是太久以前,我没有真正参与这一点的代码。(用EnumDesktopWindows?)来显示登录屏幕的桌面hwnd可能很简单,或者它可能更复杂,我实在记不清了。 – timday 2011-05-17 11:37:58