程序已运行,如何打开其所属文件 proe.exe是画图软件
09br12.prt.1是其保存的文件
用这种方法可以打开:
    shellexecute(handle,'open','proe.exe','e:\2009\9mon\09br12.prt.1',nil,sw_Show);如果proe.exe之前已经在运行状态,再执行以上代码时,会造成重复打开proe.exe这个软件。怎么才可以避免重复打开啊。
还有个问题,proe.exe在运行状态,选中09br12.prt.1直接拖放在proe软件界面上,可以打开这个文件,如果
能上delphi代码以这种方式打开文件,也不会重复打开proe.exe这个软件。

解决方案 »

  1.   

    关掉进程,然后再shellexecute(handle,'open','proe.exe','e:\2009\9mon\09br12.prt.1',nil,sw_Show); 呵呵~~直接搞不太好搞……
      

  2.   

    发送拖拽消息实现吧,用WM_DROPFILES消息
    程序是否是单实例运行不能通过外部程序实现
    你不能修改那个程序
    既然他有拖文件的功能,就用这个消息算了
    注意接收文件的句柄可能不是窗体,而是其中的一个控件
    用SPY++跟踪一下消息看看
      

  3.   

    怎么实现啊可以给运行中的pro/e这个软件发个消息,让他自动打开指向的文件吗?
      

  4.   

    就是模拟拖文件到程序上面
    用sendmessage发送这个消息
      

  5.   

    findwindows 可以找到是否这个窗体已经打开 如果已经打开则显示 否则重新打开
      

  6.   

    枚举进程列表,检测本程序进程,如果存在则返回不为0,判断,如果不为0,EXIT
      

  7.   

    查了点资料。抄袭而来,进过测试,可以使用。
    procedure TForm1.Button1Click(Sender: TObject);
     var
          Size:   Cardinal;
          DropFiles:   PDropFiles;
          Run:   PChar;
          MemHandle:   THandle;
          I:   Integer;
          hFile: HWND;
          FileName: string;
          Files: TStringList;
    begin
        hFile := FindWindow(nil, '画图软件');
        if hFile = 0 then Exit;
        FileName := 'C:\Code.txt';
          Size   :=   0;
          Files := TStringList.Create;
          Files.Add(FileName);
          for   I   :=   0   to   Files.Count   -   1   do
          begin
              Inc(Size,   Length(Files[I])   +   1);
          end;
          if   Size   >   0   then
          begin
            Inc(Size,   1   +   SizeOf(TDropFiles));
            MemHandle   :=   GlobalAlloc(GMEM_ZEROINIT,Size);
            DropFiles   :=   GlobalLock(MemHandle);
            with   DropFiles^   do
            begin
                pFiles   :=   SizeOf(TDropFiles);
                pt   :=   Point(0,   0);
                fNC   :=   False;
                fWide   :=   False;
            end;
            Run   :=   Pointer(DropFiles);
            Inc(Run,   SizeOf(TDropFiles));
            for   I   :=   0   to   Files.Count   -   1   do
            begin
                StrPCopy(Run,   Files[I]);
                Inc(Run,   Length(Files[I])   +   1);
            end;
            Run^   :=   #0;
            GlobalUnlock(MemHandle);
            PostMessage(hFile,   WM_DROPFILES,   MemHandle,   0);
            GlobalFree(MemHandle);
          end;
        Files.Free;
    end;