SlimDX kullanarak C# içinde bir Direct3D 9 tabanlı oluşturma motoru yazdım. Yeni bir projede, şimdi bir webservice kullanarak yüklü bir 3d sahnenin resimlerini dağıtmam gerekiyor. Sorun şu ki, bir şey yapmak için bir Direct3d cihazına ihtiyacım var. Bir kullanıcı sistemde oturum açmadan ve masaüstünde kilitlenmeden direct3d aygıtı oluşturmanın herhangi bir yolu var mı?Kilitli sistemde 3D sahneyi oluşturma
Bu mümkün değilse, herhangi bir geçici çözüm bilen var mı? Sonunda, belirli yerel kullanıcı hesaplarını veya bir servisi kullanarak görev planlayıcısından çalıştırılabilen bir yürütülebilir dosyaya ihtiyacım var.
Motor iki bölüme ayrılmıştır: motorun kendisi ve oluşturucu. Öyleyse başka bir yol olmazsa opengl ya da görünür bir forma sahip olmadan render edilmesine izin veren başka bir teknolojiyi kullanarak yeni bir renderer de uygulayabilirim.
Düzenleme:
Ne var bugüne kadar şudur:
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");
}
}
}
Bu minimal Windowsservice parçasıdır. Önemli kodu OnContinue işlevine koydum çünkü başlatma kodundan daha kolay hata ayıklamak daha kolay. Bu hizmetleri aktif masaüstüyle etkileşim kurma hakkı verdim. hizmeti yerel bir sistem hesabı olarak çalıştırdığımda masaüstünü ve penceresini çalıştırarak çalışır ancak GraphicsAdapters sayısı hala 0'tır, hizmeti özel bir kullanıcı hesabı kullanarak çalıştırdığımda WindowStation'ı bile açamıyorum. Denediğim başka bir şey var mı, yoksa yanlış mı yapıyorum? Hata ayıklama çok zor hale geldiğinden bu yana bir Windows 7 makinesinde test ediyorum. Bu bir sorun olabilir mi?
Teşekkür
OpenGL kilitli bile olsa masaüstünde GPU hızlandırma almak için işe yarayabilecek bir pBuffer bağlamını kullanılması durumunda
Pencere İstasyonları ile ilgili ipuçları için çok teşekkürler, bu işi yapmak için gerekli olan bazı eylemleri hatırlamaya çalışabilir misiniz? neredeyse ihtiyacım olan şey. Şimdiye kadar okuduklarımdan itibaren, etkileşimli masaüstüne (güvenlik deliği) erişme ayrıcalığımla uygulamanızı bir hizmet olarak çalıştırmam gerekiyor ve bir şekilde geçerli bir aygıt oluşturabilmem gerekiyor. Ama nasıl? ;) – Gooo
Üzgünüm, çok uzun zaman önceydi ve o kodla gerçekten ilgilenmedim.Masaüstünü, giriş ekranını (EnumDesktopWindows ile) görüntülemek için kullanılan masaüstüne almak çok kolay olabilirdi veya daha karmaşık olabilirdi, gerçekten hatırlayamıyorum. – timday