• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

浅谈delphi创建Windows服务程序与窗体实现交互

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我想实现的功能是创建一个服务程序,然后在服务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之后已经失效了。


 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#调用Matlab生成的Dll发布时间:2022-07-18
下一篇:
matlab图像剪裁命令imcrop() - realkate1发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap