界面上链接一个exe文件,如何实现若该程序已经打开,则显示该程序,否则运行该程序。环境:delphi7。谢谢。

解决方案 »

  1.   

    procedure TForm1.FormCreate(Sender: TObject);
    var
      ZAppName: array[0..127] of char;
      Hold: String;
      Found: HWND;
    begin
      Hold := Application.Title;
      Application.Title := 'OnlyOne'
         + IntToStr(HInstance); // 暂时修改窗口标题
      StrPCopy(ZAppName, Hold); // 原窗口标题
      Found := FindWindow(nil, ZAppName); // 查找窗口
      Application.Title := Hold; // 恢复窗口标题
      if Found<>0 then begin
        // 若找到则激活已运行的程序并结束自身    ShowWindow(Found, SW_RESTORE);
        Application.Terminate;
      end;
    end;
      

  2.   

    也可以用原子表来做。Win32系统中,为了实现信息共享,系统维护了一张全局原子表,用于保存字符串与之对应的标志符的组合。应用程序在原子表中可以放置字符串,并接收一个16位整数值(叫做原子,即atom),它可以用来提取该字符串.放在原子表中的字符串叫做原子的名字;  
    关于原子表  
    系统提供许多原子表.每个原子表用于不同的目的;例如,动态数据交换(DDE)应用程序使用全局原子表(global  atom  table)与其他应用程序共享项目名称和主题名称字符串.不用传递实际的字符串,一个DDE应用程序传递全局原子给它的父进程.父进程使用原子提取原子表中的字符串...  
    关于对原子的操作,有一组专门的API函数:    
    GlobalAddAtom  在表中增加全局原子    
    GlobalDeleteAtom  在表中删除全局原子    
    GlobalFindAtom  在表中搜索全局原子    
    GlobalGetAtomName  从表中获取全局原子    
    几个应用:  
    1.  可以用这种方法实现避免程序二次启动。基本处理如下:  
     
    if  (GlobalFindAtom(Atom)  !=  0)//在系统原子表中找原子  
    {  
         ::MessageBox(NULL,"已经运行了一个实例!",Application->Title.c_str(),MB_OK  &brvbar;MB_SYSTEMMODAL);  
         return  FALSE;  
    }  
    GlobalAddAtom(Atom);//增加原子  
      

  3.   

    简单办法,用一个命名的互斥体对象就可以了CreateMutex,简单的不得了。用任何命名的系统对象都可以做到。比如文件、管道、事件、等等。乱七八糟的系统对象都可以,只要是命名的