相信大家都用过WinAmp吧,我们在资源管理器中选中多个MP3文件,然后打开右键菜单,点击open with winamp后,WinAmp能一次打开所有的文件,请问如何实现这个功能呢?我在注册表中注册了MP3的文件关联,但是执行上面的行为后Windows会多次调用我的程序打开选中的MP3文件,用户选中了多少个文件,我的程序就被打开几次,每次Windows只给我的程序传递一个文件的地址,如何解决这个问题呢?
解决方案 »
- 未接触过类似问题,求教
- 急!!我的系统从新安装了之后,第三组件总是报错?
- BPL未找到
- dbexpress联接mysql时报错:“invlid username/passwd”如何解决?
- 硬件的问题 vp3主板的驱动
- 我很菜,問一下dll的問題,保存時將文件名定為testdll.dll,再打開時說Error loading...,具體請見內,100分.
- 专家分600,国庆。窃喜,大喜!散分。
- 请问大家如何推广自己的软件?
- delphi关于TAPI方面的编程,懂的人请近来。
- 好男儿请进
- cxgrid 如何使用InifileName 文件,我看了帮助查不到了。
- 奇怪的DELPHI问题,高手都来看看:)
看过很多如何使程序只运行一个实例的讨论,首先参考这样的设置在启动时检测自己以前是否有实例运行,如果没有则运行.如果有的话,则将Windouws传来的消息转发到该实例.或者自己处理一下发送自定义消息.
仅仅是看到楼主的问题后第一时间想到的不知是否正确.
1.dpr:
...
{$R *.res}var
aHandle, h: THandle;
ds: TCopyDataStruct;begin
Application.Initialize;
aHandle := FindWindow(nil, 'sec');
if aHandle <> 0 then
begin
if IsIconic(aHandle) then SendMessage(aHandle, WM_SYSCOMMAND, SC_RESTORE, 0);
if ParamCount > 0 then
begin
h := FindWindow(nil, 'Form1');
ds.cbData := Length(ParamStr(1)) + 1;
GetMem(ds.lpData, ds.cbData );
StrCopy(ds.lpData, PChar(ParamStr(1)));
SendMessage(h, WM_COPYDATA, 0, Cardinal(@ds));
end;
SetForeGroundWindow(aHandle);
Application.Terminate;
Exit;
end; Application.Title := 'sec';
Application.CreateForm(TForm1, Form1);
ds.cbData := Length(ParamStr(1)) + 1;
GetMem(ds.lpData, ds.cbData );
StrCopy(ds.lpData, PChar(ParamStr(1)));
SendMessage(Form1.Handle, WM_COPYDATA, 0, Cardinal(@ds));
Application.Run;
end.2.单元文件:
...
private
{ Private declarations }
procedure Mymessage(var Msg: TWmCopyData); message WM_COPYDATA;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{注册表中root/*/shell/openit/command/d:\t\p.exe %1}procedure TForm1.Mymessage(var Msg: TWmCopyData);
begin
Memo1.Lines.Add(StrPas(Msg.CopyDataStruct^.lpData));
end;
如果连续运行两个实例,第二个实例运用上面的语句是找不到第一个实例的,因为第一个实例还没有创建完毕,而这是Windows已经运行第二个实例了。而且用这个方法的话鼠标会闪个不停(连续的变换成‘忙’与‘正常’)。
这个方法我也想过,但是行不通,不过还是谢谢大家。
程序在没有参数时正常启动,有参数时按参数列表启动不过你的问题我同样没有解决,我试过选择20个文件,按回车,参数列表会不起作用,很郁闷,然后就开了20个窗口