【问题标题】:how to open additional files into an already running application如何在已运行的应用程序中打开其他文件
【发布时间】:2009-10-26 20:59:49
【问题描述】:

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

谢谢

【问题讨论】:

标签: delphi


【解决方案1】:

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

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

【讨论】:

  • 好点,但您有多大可能让同一用户应用程序的两个实例以不同的安全权限运行? :p
  • 只需“以管理员身份”运行第一个副本,然后将所有以后的“双击”与向第一个应用程序发送消息分开。
【解决方案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;

希望它对你有用。

【讨论】:

【解决方案3】:

查看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】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多