代码之家  ›  专栏  ›  技术社区  ›  Remus Rigo

如何在已运行的应用程序中打开其他文件

  •  2
  • Remus Rigo  · 技术社区  · 15 年前

    我正在写一个MDI文本编辑器,我想知道如何用我的应用程序打开所有文本文件。(如果我将te*.txt关联到我的应用程序,我希望每次有人双击一个txt文件在我的应用程序中打开它,在一个新的子窗口中)

    谢谢

    4 回复  |  直到 15 年前
        1
  •  2
  •   zz1433    15 年前

    我目前对此有以下实现:

    DPR文件

    var
      PrevWindow : HWND;
      S : string;
      CData : TCopyDataStruct;
    
    begin
      PrevWindow := 0;
      if OpenMutex(MUTEX_ALL_ACCESS, False, 'YourUniqueStringHere') <> 0 then
        begin
          PrevWindow:=FindWindow('TYourMainFormClassName', nil);
    
          if IsWindow(PrevWindow) then
          begin
            SendMessage(PrevWindow, WM_SYSCOMMAND, SC_RESTORE, 0);
            BringWindowToTop(PrevWindow);
            SetForegroundWindow(PrevWindow);
    
            if FileExists(ParamStr(1)) then
            begin
              S:=ParamStr(1);
              CData.dwData:=0;
              CData.lpData:=PChar(S);
              CData.cbData:=1+Length(S);
    
              SendMessage(PrevWindow, WM_COPYDATA, 0, DWORD(@CData) );
            end;
          end;
        end
      else
        CreateMutex(nil, False, 'YourUniqueStringHere');
    

    在主单元中,我们处理wm_copydata消息:

    我们声明消息处理程序

    procedure ReceiveData_Handler ( var msg : TWMCopyData ) ; message WM_COPYDATA;
    
    
    procedure TForm1.ReceiveData_Handler(var msg: TWMCopyData);
    begin
      // Your file name is in the msg.CopyDataStruct.lpData
      // Cast it to PChar();
    end;
    

    希望它对你有用。

        2
  •  4
  •   skamradt    15 年前

    解决这个问题的解决方案也是不允许多个应用程序同时运行的解决方案。您要做的是首先检测程序是否已经在运行,然后将参数传递给正在运行的应用程序并关闭。

    several methods 以确定应用程序是否已在运行。一旦您选择了一个适合您的编程首选项,下一步就是提供文件以打开正在运行的程序。这可以通过命名管道、消息(尽管如果您的应用程序在其他安全上下文中运行,则在Vista/Win7上消息会失败)或任何其他 IPC .

        3
  •  1
  •   Jeremy Mullin    15 年前

    退房 Windows DDE documentation . 我修改了注册表中的DDEExec选项,因此shell将打开的文件正确地定向到我现有的应用程序实例。以下代码使注册表更改成为必需的。将“appname”替换为您的应用程序名(并删除括号)。

         // add the ddeexec key
         if not reg.OpenKey( '\Software\Classes\<AppName>.file\shell\open\ddeexec', true ) then
            raise Exception.Create( 'Error setting ddeexec key' );
    
         try
            reg.WriteString( '', 'FileOpen("""%1""")' );
         finally
            reg.CloseKey;
         end;
    
         // modify the command key to not include the parameter, as we don't use it
         if not reg.OpenKey( '\Software\Classes\<AppName>.file\shell\Open\command', true ) then
            raise Exception.Create( 'Error opening command key.' );
    
         try
            strTemp := reg.ReadString( '' );
    
            strTemp := StringReplace( strTemp, '"%1"', '', [] );
            reg.WriteString( '', strTemp );
    
         finally
            reg.CloseKey;
         end;
    
        4
  •  0
  •   Nathan Campos    15 年前

    我不知道您使用的Delphi版本,但是在Delphi7的Examples文件夹中,您将看到一个MDI文本编辑器示例。