控制mp3播放器中文件顺序

       MP3播放器价格不断降低,容量一涨再涨。比如的MP3播放器是1G的,闲暇之余很喜欢

 

用它听评书。但在使用中发现:很难控制拷贝到mp3播放器中的文件顺序,前一章已经是

 

孔明用智激周瑜,后一回才是刘玄德三顾草庐。针对这个问题,做了一点研究:

 

文件播放顺序是播放器中的FAT表中文件的顺序,使用WinHex工具直接察看可以看到如下

 

 

          播放起来是按照 情人〉海阔天空 〉光辉岁月 …… 这个顺序。

 

我猜测拷贝粘贴命令的顺序决定了这个顺序,而选择顺序又是放在什么地方呢?

 

只有一种可能:剪切板。经过一番试验,果真在剪切板上看到了拷贝的文件名。

 

于是,设计程序,思路是:取得获得剪切板内容,排序,再放回去。程序界面很简单

 

3个按钮,1Memo。程序清单如下:

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls,Clipbrd,shellapi,shlobj;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    ListBox1: TListBox;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

   private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject); //获得剪切板上的

var

   drophandle  :Thandle;

   i,filescount  :integer;

   FileName   :array[0..MAX_PATH] of Char;

begin

  if clipboard.HasFormat(CF_HDROP) then  //确定剪切板上是文件名称

    begin

      drophandle:=Clipboard.GetAsHandle(CF_HDROP);

      filescount:=DragQueryFile(

                       Drophandle,

                       $FFFFFFFF,

                       Filename,

                       max_path); //获得文件拖放数目

      for i:=0 to filescount-1 do

          begin

            fillchar(filename,sizeof(filename),0);

            if DragQueryFile(drophandle,i, Filename,max_path)>0 then

                       ListBox1.Items.Add(strpas(@filename));

          end; //获取所有拖放文件的文件名,带目录

    end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin    //排序,实际上这部分可以做在上面建立的时候

         //为了以后的扩展考虑(比如,针对日期,大小排序等等)

         //特别将其放在另外的地方

  ListBox1.Sorted:=True;

end;

 

procedure TForm1.Button3Click(Sender: TObject); //将排序后的文件名称塞回去

var

  sFilenames: String;

  i: Integer;

  hBuffer: HGLOBAL;

  pBuffer: PDropFiles;

begin

  if ListBox1.Items.Count=0 then exit;

 

  //文件名之间使用 #0 分隔,用#0#0 表示结束 #0#0

  sFilenames := '';

  for i := 0 to ListBox1.Items.Count - 1 do

    sFilenames := sFilenames + ListBox1.Items[i]+ #0;

  sFilenames := sFilenames + #0;

 

  hBuffer := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT,

    SizeOf(DROPFILES) + Length(sFilenames));

pBuffer := GlobalLock(hBuffer);

 

    // 建立 "DROPFILES" 结构体

    pBuffer^.pFiles := SizeOf(DROPFILES);

pBuffer := Pointer(Integer(pBuffer) + SizeOf(DROPFILES));

    CopyMemory(pBuffer, PChar(sFilenames), Length(sFilenames));

    Clipboard.SetAsHandle(CF_HDROP, hBuffer);

end;

end.

 

试验一下:选定文件,ctrl+c ,用我们的程序先看一下剪切板上的内容

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值