我写一个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