为了防止程序多次运行,需要
使用findWindow得到应用程序的进程,如果发现已经运行,则退出,否则运行,我使用的是FindWindow(nil,'应用程序名'),可是不行

解决方案 »

  1.   

    FindWindow(窗体类名,'应用程序名')
      

  2.   

    我大概知道了,运行winsight32.exe可以知道类名,不过我的这个程序不能用了
      

  3.   

    FindWindow(nil,'应用程序主窗口名')  注意:是'应用程序主窗口名',而不是'应用程序名'!!!
    findWindow是得不到应用程序的进程id的,只能得到应用程序内某窗口的句柄,因此一般用应用程序的主窗口来进行判断程序是否运行!!这种方法虽然有它的局限性,但一般情况下都是可行的!!
      

  4.   

    pazee(耙子)(灵感点亮生活)的方法较好!!
      

  5.   

    用FindWindow并不太好吧,去找找"CreateMutex"的用法吧.
      

  6.   

    Delphi6中的winsight32.exe是不是不能用?我看用它可以得到应用程序的类名,有没有其他的办法可以知道应用程序的类名
      

  7.   

    实现单实例运行的关键是判断前一实例是否存在,Win3.x中运行的程序能获知前一实例的句柄,从而可以方便地进行判断,但 Windows是抢先式多任务系统,其程序的前一实例句柄恒为零,所以只有另寻其他办法。目前最有效的办法是通过查看是否有相同窗口类名的例程存在来进行判断。在Delphi中实现的方法。 
    1、对主窗口程序的改动: 
    在主窗口(即程序创建的第一个窗口)中interface节加入 
    const 
    CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息} 
    MYAPPNAME = "My Delphi Program"; 
    并在Form的定义的public节中加入 
    procedure CreateParams(var Params: TCreateParams); override; 
    Procedure RestoreRequest(var message: TMessage); message CM_RESTORE; 
    在implementation节中加入 
    {指定窗口名称} 
    procedure TForm1.CreateParams(var Params: TCreateParams); 
    begin 
    inherited CreateParams(Params); 
    Params.WinClassName := MYAPPNAME; 
    end; 
    {处理“恢复”消息} 
    procedure TForm1.RestoreRequest(var message: TMessage); 
    procedure TForm1.RestoreRequest(var message: TMessage); 
    begin 
    if IsIconic(Application.Handle) = TRUE then 
    Application.Restore 
    else 
    Application.BringToFront; 
    end; 
    经过以上修改,程序的主窗口的类名已经被指定了,这是进行判断的基础。一般在程序刚开始运行的时候进行判断,所以还要对DPR文件进行修改。 
    2、对DPR文件的改动 
    在 uses 节中添加 windows、messages这两个单元加入下列语句,注意两个文件中常量CM_RESTORE和MYAPPNAME的定义必须一致 
    const 
    CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息} 
    MYAPPNAME = "My Delphi Program"; 
    var 
    RvHandle : hWnd; 
    将下列语句插到程序最前部(在Application.Initialize之前) 
    RvHandle := FindWindow(MYAPPNAME, NIL); 
    if RvHandle > 0 then 
    begin 
    PostMessage(RvHandle, CM_RESTORE, 0, 0); 
    Exit; 
    end; 
    这段程序的意思是如果找到一个类名相同的窗口,则向该窗口发送一个消息,并退出,而本例中原窗口收到该消息后会自动激活或从图标还原,从而达到了避免二次运行且能自动调出前一例程的目的。 
      

  8.   

    在dpr里uses Windows, 
    CreateMutex(Nil, true, ‘DGTSrun‘);//‘DGTSrun‘随便,作标志 
    if GetLastError < > ERROR_ALREADY_EXISTS then 
    begin 
    Application.Initialize; 
    Application.CreateForm(TTeach_Main, Teach_Main); 
    //............ 
    Application.Run; 
    end;
    http://community.csdn.net/Expert/topic/3154/3154736.xml?temp=.4693415
      

  9.   

    个人感觉, nzh517(沙中泥) 得用法比较好,谢谢大家
      

  10.   

    用mutex比较有保证点,
    接点分