博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈delphi创建Windows服务程序与窗体实现交互
阅读量:5254 次
发布时间:2019-06-14

本文共 1132 字,大约阅读时间需要 3 分钟。

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

 

 

转载于:https://www.cnblogs.com/studypanp/p/4887361.html

你可能感兴趣的文章
入门图像处理
查看>>
Acrobat.CAcroPDDoc open 无法找到指定文件
查看>>
Google css & Google fonts
查看>>
你是码农涅,还是创造者涅(内容是转载的,标题是我写的)
查看>>
如何组织Html元素与如何进行CSS命名(下)
查看>>
大型物件列印之翹曲現象與加熱板作用論述
查看>>
element input-number源码
查看>>
使用WiX打包你的应用程序之二---向WiX脚本传递信息(属性)的几种方式
查看>>
使用this 调用另一个构造器
查看>>
Input checkbox 添加样式背景
查看>>
(C语言)单链表的顺序实现(数据结构一)
查看>>
shuzhuanshuzu
查看>>
poj3384Feng Shui
查看>>
neural network
查看>>
JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
查看>>
Nginx和uwsgi的优化
查看>>
mysql 强制修改密码
查看>>
C#基础知识总结(六)
查看>>
多个数据读取的两种简写方法
查看>>
python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__
查看>>