to: sundayboys(sunboy) 好办法,但是两个实例之间怎么传消息?

解决方案 »

  1.   

    用互拆来保证程序只运行一次,这个可以看以前的帖子,很多的。
    当发现已经运行,然后FindWindowsEx找那个窗口的句柄,找到后PostMessage(runingHandle,OPEN_NEW_FILE,Nil,Nil),这个OPEN_NEW_FILE是自己定义的消息,然后你在程序里边处理这个自定义消息就行了。
    文件的路径可以从commandline中获取。
      

  2.   

    to: sundayboys(sunboy) 谢谢,我下线试一下,不行再来问你。现在我还不想结束贴子,看看还有没有人回复,我会给分的。
      

  3.   

    用原子(Atom):procedure CheckPrevInstance;
    var
      PrevWindow: HWND;
      i: Integer;
      Atom: TAtom;
    begin
      if GlobalFindAtom(PChar('APPLICATION_IS_RUNNING')) = 0 then
      begin
        CheckPreInsAtom := GlobalAddAtom(PChar('APPLICATION_IS_RUNNING'));
      end else
      begin
        repeat
          PrevWindow := FindWindow('MAINFORM_CLASS', nil);
        until PrevWindow <> 0;
        for i := 1 to ParamCount do
        begin
          Atom := GlobalAddAtom(PChar(ParamStr(i)));
          SendMessage(PrevWindow, WM_XXXX, Atom, 0); // 通知消息
          GlobalDeleteAtom(Atom);
        end;
        SetForeGroundWindow(PrevWindow);
        SendMessage(PrevWindow, WM_XXXX, 0, 0); // 通知消息
        Halt;
      end;
    end;APPLICATION_IS_RUNNING 是应用程序运行标志
    MAINFORM_CLASS 是主窗口类名
    WM_XXXX 是发送给应用程序的消息,起到通知的作用以上在 Application.Initialize 前调用
      

  4.   

    参考下面一段程序
    program project1;uses
      Forms,
      windows, 
      .....{$R *.RES}begin
      CreateMutex(Nil,false,'project1');
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        if Application.MessageBox('程序project1正在运行,是否再另外打开一个?','project1',4)=IDNO then
        begin
          SendMessage(HWND_BROADCAST,RegisterWindowMessage('eExs'),0,0);
          Halt(0);
        end;
      end;
      Application.Initialize;
      Application.CreateForm(Tfrmmain, frmmain);
      Application.Run;
    end.这样可以让用户自己决定是否再运行一次本程序。