我已經使用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