老产品维护问题,
Delphi 版本:delphi6如果新建一个Application,
用一下Code可以获得正确的Handleprocedure TForm1.Button1Click(Sender: TObject);
var
  EVMHandle:HWND;
  EVMTitle: String;
begin
  EVMHandle:=FindWindow(nil,'console');
  Showmessage(inttostr(EVMHandle));
end;
但如果写一个delphi service application,
返回的handle值一直是0procedure TSvcChkHandle.ServiceStart(Sender: TService;
  var Started: Boolean);
var
  EVMHandle: HWND;
begin
  try
    Coinitialize(nil);
    EVMHandle:=FindWindow(nil,'console');
    Writelog(inttostr(EVMHandle));
    Started := True;
  except
    On E: Exception do LogMessage(E.Message);
  end;
end;console 是我一个应用程序的窗口标题在线等,谢谢

解决方案 »

  1.   

    service 分为可用户交互的和不可用户交互的。 微软建议服务都是做成不可用户交互的,因为服务可以先于用户登录而启动,如果需要用户交互,这时候就会出现问题。不可交互的服务是无法进行类似普通应用程序的操作的,多了很多限制。如果你的程序确实需要 findwindow,那最好不要做成服务,也没这个必要,放到系统的自启动里就行了。
      

  2.   

    有没有什么方法在service里面可以检查某一个应用程序是否在运行?老的产品在service里用Findwindow 来判断应用程序是否运行,怀疑是否windows2000里面可以
    ,但XP或者更高版本有问题,我在网上查到很多类似问题,但还没有解决我目前问题的方法。谢谢关注,请继续支招。
      

  3.   

    可以用 psapi 单元的 EnumProcesses 或者 toolhlp 单元的 CreateToolhelp32Snapshot, Process32First, Process32Next 来定时枚举进程。其中 EnumProcess 只支持 nt 系列的 windows,而后面的三个函数支持win95以后的全部windows系统。