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

时间:2009-10-26 20:59:50

标签: delphi

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

感谢

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

我目前有以下实现:

.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 :(得分:1)

查看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;

答案 3 :(得分:0)

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