zoukankan      html  css  js  c++  java
  • 浅谈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之后已经失效了。

    
    
    
  • 相关阅读:
    Table交替行变色 鼠标经过变色 单击变色
    编程专用字体(雅黑字体+Consolas)
    Enterprise Architect学习笔记-EA中关系
    通用分页存储过程
    解决vs2008无法切换设计视图
    盒子模式
    ASP.NET界面数据绑定大大杂烩
    Tyvj P1032 Begin2 Unit1 身份验证
    NOIP2010普及组T1
    TyvjBegin P1036 Begin2 Unit1 数独验证
  • 原文地址:https://www.cnblogs.com/studypanp/p/4887361.html
Copyright © 2011-2022 走看看