大家寫windows服務守護進程的時候,肯定會遇到啟動的程序看不到界面,只能在任務管理器里面看到xxx.exe問題.
發現可能有如下情況
a.無論是開機,還是程序被關掉后,守護服務啟動的程序只能看到任務管理器exe的進程,看不到界面;
b.開機后,守護服務自動啟動程序,只能看到進程里面有exe進程,看不到界面,但是殺掉進程重啟后,能看到界面;
我來給出解決方法:
1.服務中的啟動程序代碼用如下方法:
string appStartPath = @"C:\Test.exe";
IntPtr userTokenHandle = IntPtr.Zero;
ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle);
ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION();
ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO();
startInfo.cb = (uint)Marshal.SizeOf(startInfo);
ApiDefinitions.CreateProcessAsUser(
userTokenHandle,
appStartPath,
"",
IntPtr.Zero,
IntPtr.Zero,
false,
0,
IntPtr.Zero,
null,
ref startInfo,
out procInfo);
if (userTokenHandle != IntPtr.Zero)
ApiDefinitions.CloseHandle(userTokenHandle);
需要下載Cjwdev.WindowsApi.dll,很多資源,自己baidu去下載
2.必須要有一個開機不輸入密碼就可以登錄的用戶,使用命令control userpasswords2設置.
以上很簡單的兩點,我是測試過好多次了.發現是這個規律的時候,我不會告訴我你,我是多么的興奮.[當時我在本地的機器上,着確實是成功了的]
有人寫了代碼后,可能認為不需要用第二點中增加自動登錄的用戶,那可能是本機只有一個用戶造成的(沒有測試,推測).
需要這種守護進程的電腦,一般都是服務器,而服務器一般都是遠程操作.而且客戶一般不會給你administrator賬戶,而是給你一個其他的賬戶.
(一般客戶只看程序的界面,不會去查看進程,所以,沒有界面,他就覺得程序沒有啟動.)
所以上面這種情況,是萬惡的客戶逼我做出來的,然后是我苦逼的做了各種實驗得到的結果.
別忘記點贊.
==========================
補充:
上面的問題解決方法有時候在某些機器上不行.不過在本機確實是測試通過的,然后在服務器上設置后,依然不行.
又給出一種新的解決方法:在服務器安裝vnc服務端.(大家覺得很奇怪吧,不過這方法真的可行).
注意:VNC不可用remote安裝的哦,必須插上顯示器,鼠標鍵盤,親自登陸到機器上安裝.
========================
以下為其他網友的解決方法,沒有驗證過.你可以嘗試
http://www.cnblogs.com/qfb620/archive/2009/08/05/1539557.html
