MP3播放器价格不断降低,容量一涨再涨。比如的MP3播放器是1G的,闲暇之余很喜欢
用它听评书。但在使用中发现:很难控制拷贝到mp3播放器中的文件顺序,前一章已经是
“孔明用智激周瑜”,后一回才是“刘玄德三顾草庐”。针对这个问题,做了一点研究:
文件播放顺序是播放器中的FAT表中文件的顺序,使用WinHex工具直接察看,可以看到如下:
播放起来是按照 情人—〉海阔天空 –〉光辉岁月 …… 这个顺序。 我猜测拷贝粘贴命令的顺序决定了这个顺序,而选择顺序又是放在什么地方呢? 只有一种可能:剪切板。经过一番试验,果真在剪切板上看到了拷贝的文件名。 于是,设计程序,思路是:取得获得剪切板内容,排序,再放回去。程序界面很简单 3个按钮,1个Memo。程序清单如下: 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 ,用我们的程序先看一下剪切板上的内容