问题1:如题,就像winamp等软件那样,程序只被装载一次,不能多次生成实例。问题2:如果程序已经运行了,那么再次执行程序时,将系统焦点设置给已经运行的程  序。就像金山词霸2003那样。

解决方案 »

  1.   

    这个问题很多书上和电子教程上都有介绍的吧,
    在project里不用写多少就可以了吧~具体的要查资料了呀~
      

  2.   

    Var Hwnd:Thandle;
    begin
      Hwnd:=FindWindow(nil,'frmmain');
      If Hwnd=0 then
      begin
      .................
      Application.Run;
      end;
    end;
      

  3.   

    回复人: LMale(嘿嘿!~*_*^) ( ) 信誉:100  2002-9-1 11:03:14  得分:0 
     
     
      
    AtomText:string;//添加一个String的全局变量用于保存原子名称
    ........procedure LookFroPreviousInstance;
    var
      PreviousInstanceWindow:hWnd;
      AppName:Tatom;
      FoundAtom:Tatom;
    begin
      AtomText:='onlyOne'+Application.Title;
      FoundAtom:=GlobalFindAtom(pChar(AtomText));
      if FoundAtom<>0 then
        begin
         showMessage('该程序已经在运行');
         AppName:=Application.Title;
         Application.ShowMainForm:=False;
         Application.Title:='Destroy me';
         previousInstancWindow:=FindWindow(nil,pChar(AppName));
         if  PreviousInstanceWindow<>0 then
           if IsIconic(PreciousInstanceWindow) then
                     showWindow(PreviousInstanceWindow,SW_RESTORE)
            else
              SetForegroundWindow(PreviousInstanceWindow);
             Application.Terminate;
              
          end
        else
        GlobalAddAtom(PChar(AtomText));
      procedure TForm1.FormCreate(Sender:Tobject);
      begin
        inherited;
        LookforPreViousInstance;
      end;
      //FormDestroy也要重写,找到该原子进行销毁  
     
      

  4.   

    procedure Tmaimform.FormCreate(sender:TObject);
        var
          temp:integer;
          ZAPPname:array[0..127]of char;
          Hold:string;
          Found:HWND;
        begin
           systemparametersinfo(spi_screensaverrunning,1,@temp,0);
           Hold:=application.Title;
           Application.Title:='only'+IntTOstr(HInstance);
           StrPCopy(ZAppName,Hold);
           Found:=FindWindow(nil,ZAPPName);
           Application.Title:=Hold;
           if Found<>0 then
              begin
                 showwindow(Found,SW_RESTORE);
                 Application.terminate;
              end ;   application.OnHint:=myshowhint;
       end;
      

  5.   

    temp:integer;

    systemparametersinfo(spi_screensaverrunning,1,@temp,0);
    可删除是禁用系统功能键的
      

  6.   

    ………
           if Found<>0 then
              begin
                 showwindow(Found,SW_RESTORE);
                 Application.terminate;
              end ;………请问楼上的,found为hwnd类型变量,它怎么也不能为0,实际验证的结果也正如我想,不好用。
      

  7.   

    Found为hwnd的时候,可以为0。
    表示FindWindow执行失败没有找到要找的窗口阿~~~~或者使用互斥器来实现
      

  8.   

    楼上说的对是对,但不是我问的意思。我想说的是:我运行第一次和运行第二次,通过found值没有法判断,它不是个定值!!
      

  9.   

    var
      hnd: THandle;initialization
      //建立一个互斥对象,防止应用程序被重复开启
      hnd := CreateMutex(nil, True, 'abc');
      if GetLastError = ERROR_ALREADY_EXISTS then
        Halt;
    finalization
      if hnd <> 0 then
        CloseHandle(hnd);