淺談delphi創建Windows服務程序與窗體實現交互


我想實現的功能是創建一個服務程序,然后在服務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之后已經失效了。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM