2009-10-26 61 views
2

我寫一個MDI文本編輯器,我想知道我怎樣可以打開我的應用程序中的所有文本文件。 (如果我TE * .TXT到我的應用程序相關聯的我想是一個txt文件,每次有人雙擊在我的應用程序打開它,在一個新的子窗口)如何打開其他文件到一個已經運行的應用程序

感謝

+0

重複:http://stackoverflow.com/questions/600490/how-to-open-multiple-files-with-delphi-program-invoked-via-shell-open – 2009-10-26 21:11:26

+0

不完全重複的,這任務是詢問如何將其他文件打開到已經運行的應用程序中。 – skamradt 2009-10-26 21:40:22

+0

在已運行的應用程序中打開附加文件是我想要的 – 2009-10-26 21:42:24

回答

2

我現在有這樣做的以下實現:

在主單元我們處理WM_COPYDATA消息.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'); 

我們聲明的消息處理程序

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; 

希望它爲你工作。

+1

您的代碼包含一個競爭條件,應該始終調用'CreateMutex()',並檢查是否'GetLastError函數()''返回ERROR_ALREADY_EXISTS'。請參閱http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx。我發現一般缺乏對錯誤處理的干擾...... – mghie 2009-10-27 13:26:35

0

我不知道你正在使用的Delphi的版本,但在Delphi 7的examples文件夾中,你會看到一個MDI文本編輯器的例子。

4

解決這個也是不允許多個應用程序在同一時間運行的解決方案。你想要做的是首先檢測程序是否已經運行,然後將參數傳遞給正在運行的應用程序並關閉。

several methods,以確定您的應用程序已經運行。一旦選擇適合您的編程偏好的文件,下一步就是將文件提供給正在運行的程序。這可以通過命名管道,消息來完成(雖然消息並在Vista/Win7的,如果您的應用程序在另一個安全上下文中運行失敗),或IPC任何其他方法。

+0

好點,但您有多大可能有不同的安全priveliges運行相同的應用程序用戶的兩個實例? :P – 2009-10-27 01:01:37

+0

只需要第一個副本「以管理員身份」運行然後將消息發送到第一應用程序分開所有後來的「雙擊」。 – skamradt 2009-10-27 18:13:53

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; 
相關問題