Я написал движок рендеринга на основе Direct3D 9 в c #, используя SlimDX. В новом проекте мне теперь нужно распространять изображения загруженной 3d-сцены с помощью веб-сервиса. Проблема в том, что для того, чтобы что-то сделать вообще, мне нужно устройство Direct3d. Есть ли способ создать устройство direct3d без входа пользователя в систему и блокировки рабочего стола?
Если это невозможно, кто-нибудь знает об обходном пути? В конце мне нужен либо исполняемый файл, который можно запустить из планировщика задач с использованием некоторой локальной учетной записи пользователя, либо службы, которая периодически отображает изображения сцены с определенных точек зрения.
Двигатель разделен на две части: сам двигатель и средство визуализации. Поэтому, если нет другого пути, я мог бы также реализовать новый рендер, используя opengl или любую другую технологию, которая позволяет выполнять рендеринг без видимой формы.
Edit:
То, что я имею до сих пор, таково:
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");
}
}
}
Это часть минимальной службы Windows. Я поместил важный код в функцию OnContinue, потому что его легче отлаживать, чем код запуска. Я дал этим сервисам право взаимодействовать с активным рабочим столом. когда я запускаю службу как локальную системную учетную запись, получая рабочий стол и windowstation, но число GraphicsAdapters по-прежнему равно 0, когда я запускаю службу с использованием выделенной учетной записи пользователя, я даже не могу открыть WindowStation. Есть ли что-то еще, что я могу попробовать или что я делаю не так? Я тестирую это на компьютере с Windows 7, в то время как я вошел в систему, так как в противном случае отладка становится очень сложной. Может ли это быть проблемой?
Спасибо