我寫一個MDI文本編輯器,我想知道我怎樣可以打開我的應用程序中的所有文本文件。 (如果我TE * .TXT到我的應用程序相關聯的我想是一個txt文件,每次有人雙擊在我的應用程序打開它,在一個新的子窗口)如何打開其他文件到一個已經運行的應用程序
感謝
我寫一個MDI文本編輯器,我想知道我怎樣可以打開我的應用程序中的所有文本文件。 (如果我TE * .TXT到我的應用程序相關聯的我想是一個txt文件,每次有人雙擊在我的應用程序打開它,在一個新的子窗口)如何打開其他文件到一個已經運行的應用程序
感謝
我現在有這樣做的以下實現:
在主單元我們處理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;
希望它爲你工作。
您的代碼包含一個競爭條件,應該始終調用'CreateMutex()',並檢查是否'GetLastError函數()''返回ERROR_ALREADY_EXISTS'。請參閱http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx。我發現一般缺乏對錯誤處理的干擾...... – mghie 2009-10-27 13:26:35
我不知道你正在使用的Delphi的版本,但在Delphi 7的examples文件夾中,你會看到一個MDI文本編輯器的例子。
解決這個也是不允許多個應用程序在同一時間運行的解決方案。你想要做的是首先檢測程序是否已經運行,然後將參數傳遞給正在運行的應用程序並關閉。
有several methods,以確定您的應用程序已經運行。一旦選擇適合您的編程偏好的文件,下一步就是將文件提供給正在運行的程序。這可以通過命名管道,消息來完成(雖然消息並在Vista/Win7的,如果您的應用程序在另一個安全上下文中運行失敗),或IPC任何其他方法。
好點,但您有多大可能有不同的安全priveliges運行相同的應用程序用戶的兩個實例? :P – 2009-10-27 01:01:37
只需要第一個副本「以管理員身份」運行然後將消息發送到第一應用程序分開所有後來的「雙擊」。 – skamradt 2009-10-27 18:13:53
退房的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;
重複:http://stackoverflow.com/questions/600490/how-to-open-multiple-files-with-delphi-program-invoked-via-shell-open – 2009-10-26 21:11:26
不完全重複的,這任務是詢問如何將其他文件打開到已經運行的應用程序中。 – skamradt 2009-10-26 21:40:22
在已運行的應用程序中打開附加文件是我想要的 – 2009-10-26 21:42:24