相信大家都用过WinAmp吧,我们在资源管理器中选中多个MP3文件,然后打开右键菜单,点击open with winamp后,WinAmp能一次打开所有的文件,请问如何实现这个功能呢?我在注册表中注册了MP3的文件关联,但是执行上面的行为后Windows会多次调用我的程序打开选中的MP3文件,用户选中了多少个文件,我的程序就被打开几次,每次Windows只给我的程序传递一个文件的地址,如何解决这个问题呢?

解决方案 »

  1.   

    没作过?看了您的问题后有个想法不知道能不能行?
    看过很多如何使程序只运行一个实例的讨论,首先参考这样的设置在启动时检测自己以前是否有实例运行,如果没有则运行.如果有的话,则将Windouws传来的消息转发到该实例.或者自己处理一下发送自定义消息.
    仅仅是看到楼主的问题后第一时间想到的不知是否正确.
      

  2.   

    你试一下,加 {}中代码入注册表中以方便测试:
    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;
      

  3.   

    aHandle := FindWindow(nil, 'sec');
    如果连续运行两个实例,第二个实例运用上面的语句是找不到第一个实例的,因为第一个实例还没有创建完毕,而这是Windows已经运行第二个实例了。而且用这个方法的话鼠标会闪个不停(连续的变换成‘忙’与‘正常’)。
    这个方法我也想过,但是行不通,不过还是谢谢大家。
      

  4.   

    要用到外壳宽展的ContextMenuHandlers具体看msdn.
      

  5.   

    我的方法是,得到你选中的所有文件名,组合成一个字符串,每个文件名以ascii的0隔开,把这个字符串作为参数传给你的程序。
    程序在没有参数时正常启动,有参数时按参数列表启动不过你的问题我同样没有解决,我试过选择20个文件,按回车,参数列表会不起作用,很郁闷,然后就开了20个窗口
      

  6.   

    必须用到外壳宽展的ContextMenuHandlers具体看msdn,winamp 就是这样做的.否则你只有写folder.htt再里面调用一个activex control . you know system32 ,program files .... folder,it's folder.htt was writed;
      

  7.   

    可以使用互斥量来控制进程的单个实例,findwind不是最好的