我正在编写MDI文本编辑器,我想知道如何使用我的应用程序打开所有文本文件。 (如果我将te * .txt关联到我的应用程序,我希望每次有人双击txt文件在我的应用程序中打开它,在新的子窗口中)
感谢
答案 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文本编辑器示例。