我想實現的功能是創建一個服務程序,然后在服務Start時動態創建一個窗體Form,然后把Form縮小時變成TrayIcon放在Windows托盤上。
我在服務程序的OnStart事件中寫到
Started := True; writeWorkLog('serve2 start'); // 寫日志 Svcmgr.Application.CreateForm(TForm1, Form1); Form1.show;
日志過程為:
procedure writeWorkLog(sqlstr: string); var filev: TextFile; ss: string; begin sqlstr:=DateTimeToStr(Now)+' Log: '+sqlstr; ss:='d:\RunLog.txt'; if FileExists(ss) then begin AssignFile(filev, ss); append(filev); writeln(filev, sqlstr); end else begin AssignFile(filev, ss); ReWrite(filev); writeln(filev, sqlstr); end; CloseFile(filev); end;
但是Form1根本就不Show, 而日志中顯示已經到Startg過程里。而我測試Form1.Showing為True,說明窗體還是顯示了。
然后我在Form1的OnCreate事件中測試,日志文件都有顯示到事件里來了,但就是不顯示。
后來我在Form1中放了一個Label,在Form1的OnCreate事件中給Label.Caption重新賦值,再打印Label.Caption到txt內,發現Label的Caption已經修改了。
其實Form是顯示出來了,只是在服務里啟動的,屏幕上不顯示。據說以前XP和以前的系統的可以,現在換成Win7了就不行了。
據說從Vista起,Windows的內核針對服務的桌面交互問題做了修改,服務所運行的帳號和當前登錄的用戶的帳號的桌面是獨立的,所以不能夠在桌面顯示服務里面的窗體了。
一般這個時候會單獨開啟一個空的桌面提示你對交互窗體操作的。
你可以在服務的屬性當中,把服務的屬性,【登錄】,【登錄身份】改成桌面用戶再試試看。
Windows Vista以前,服務默認的賬戶是System,桌面與當前交互桌面共享,Vista之后已經失效了。