📄 cnwinampctrl.pas
字号:
cds : COPYDATASTRUCT;
begin
PPath := PChar(strPath);
cds.dwData := IPC_PLAYFILE;
cds.lpData := PPath;
cds.cbData := strlen(cds.lpData)+1; // include space for null char
SendMessageToWinamp(WM_COPYDATA, WPARAM(0), LPARAM(@cds));
if FAutoFind then WritePlayList;
end;
procedure TCnWinampCtrl.ClearPlayList;
begin
SendMessageToWinamp(WM_WA_IPC, 0, IPC_DELETE);
if FAutoFind then WritePlayList;
end;
procedure TCnWinampCtrl.CloseWinamp;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_FILE_QUIT ,0);
FWndWinamp := 0;
end;
function TCnWinampCtrl.FindWinamp: Boolean;
begin
FWndWinamp := FindWindow(WinampClassName, nil);
Result := IsFound;
end;
procedure TCnWinampCtrl.FFW_5sec;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_FFWD5S, 0);
end;
procedure TCnWinampCtrl.GetComponentInfo(var AName, Author, Email, Comment:
string);
begin
AName := 'Winamp控制器组件';
Author := '小冬';
Email := 'kendling@21cn.com';
Comment := '可以控制Winamp的一个小小控件';
end;
function TCnWinampCtrl.GetEQData(const Index: TEQDataSelect): Byte;
begin
Result := SendMessageToWinamp(WM_WA_IPC, Ord(Index), IPC_GETEQDATA);
end;
function TCnWinampCtrl.GetInfo(const iMode: Integer): Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, iMode, IPC_GETINFO);
end;
function TCnWinampCtrl.GetPlayList: string;
var
slPlayList, slCPlayList: TStrings;
i, j: Integer;
begin
{检测是否设置了Winamp路径}
Result := '';
if not FileExists(FWAPath) then Exit;
if FAutoFind then WritePlayList;
{获取当前播放列表}
slPlayList := TStringList.Create;
slCPlayList := TStringList.Create;
slPlayList.LoadFromFile(ChangeFileExt(FWAPath, '.m3u'));
if UpperCase(slPlayList[0]) = '#EXTM3U' then
begin
i := 1;
while i < slPlayList.Count do
begin
if UpperCase(Copy(slPlayList[i], 1, 7)) = '#EXTINF' then
begin
j := AnsiPos(',', slPlayList[i]);
slCPlayList.Add(Copy(slPlayList[i], j+1, 256));
Inc(i);
end else
begin
slCPlayList.Add(ExtractFileName(slPlayList[i]));
end;
Inc(i);
end;
{输出播放列表}
Result := slCPlayList.CommaText;
end;
slPlayList.Free;
slCPlayList.Free;
end;
function TCnWinampCtrl.GetIsFound: Boolean;
begin
Result := FWndWinamp <> 0; //INVALID_HANDLE_VALUE [DWord(-1)]; 2005.3.7 QQCAT
end;
procedure TCnWinampCtrl.GetPlayListCount;
begin
SendMessageToWinamp(WM_WA_IPC, 0, IPC_GETLISTLENGTH);
end;
function TCnWinampCtrl.GetPlayListPos: Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 0, IPC_GETLISTPOS);
end;
function TCnWinampCtrl.GetTimeLength: Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 1, IPC_GETOUTPUTTIME);
end;
function TCnWinampCtrl.GetVersion: string;
begin
Result := IntToHex(SendMessageToWinamp(WM_WA_IPC, 0, IPC_GETVERSION), 2);
if Result = '00' then
begin
Result := '0';
Exit;
end;
if Result[1] = '2' then Result[3] := Result[2];
if Result[1] = '1' then Result[3] := Result[2];
Result[2] := '.';
end;
function TCnWinampCtrl.GetVolume: Byte;
begin
Result := SendMessageToWinamp(WM_WA_IPC, -666, IPC_SETVOLUME);
end;
function TCnWinampCtrl.GetVolBalance: Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, -666, IPC_SETPANNING);
end;
function TCnWinampCtrl.GetWACurrentTime: Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 0, IPC_GETOUTPUTTIME);
end;
function TCnWinampCtrl.GetWARepeat: Boolean;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 0, IPC_GET_REPEAT)>0;
end;
function TCnWinampCtrl.GetWAShufle: Boolean;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 0, IPC_GET_SHUFFLE)>0;
end;
function TCnWinampCtrl.GetWAState: Integer;
begin
Result := SendMessageToWinamp(WM_WA_IPC, 0, IPC_ISPLAYING);
end;
procedure TCnWinampCtrl.JUMP10BACK;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_JUMP10BACK, 0);
end;
procedure TCnWinampCtrl.JUMP10FWD;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_JUMP10FWD, 0);
end;
procedure TCnWinampCtrl.NextTack;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_BUTTON5, 0);
end;
procedure TCnWinampCtrl.Pause;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_BUTTON3, 0);
end;
procedure TCnWinampCtrl.Play;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_BUTTON2, 0);
end;
procedure TCnWinampCtrl.PlayIndex(const Index: Integer);
begin
SendMessageToWinamp(WM_WA_IPC, WPARAM(Index), IPC_CHANGECURRENTFILE);
end;
procedure TCnWinampCtrl.PlayListSortInFileName;
begin
SendMessageToWinamp(WM_COMMAND, IDC_SORT_FILENAME, 0);
end;
procedure TCnWinampCtrl.PlayListSortInFilePath;
begin
SendMessageToWinamp(WM_COMMAND, IDC_SORT_ENTIREFILENAME, 0);
end;
procedure TCnWinampCtrl.PlayListSortInTitle;
begin
SendMessageToWinamp(WM_COMMAND, IDC_SORT_FILETITLE, 0);
end;
procedure TCnWinampCtrl.PrevTrack;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_BUTTON1, 0);
end;
procedure TCnWinampCtrl.RestartWinamp;
begin
SendMessageToWinamp(WM_WA_IPC, 0, IPC_RESTARTWINAMP);
end;
procedure TCnWinampCtrl.REW_5sec;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_REW5S, 0);
end;
function TCnWinampCtrl.SendMessageToWinamp(Msg: Cardinal; wParam: WPARAM;
lParam: LPARAM): Integer;
begin
Result := 0;
if not IsFound then Exit;
Result := SendMessage(FWndWinamp, Msg, wParam, lParam);
end;
procedure TCnWinampCtrl.SetEnabledWAWindow(const Value: Boolean);
begin
if Value then
SendMessageToWinamp(WM_WA_IPC, 0, IPC_ENABLEDISABLE_ALL_WINDOWS)
else
SendMessageToWinamp(WM_WA_IPC, WPARAM($DEADBEEF), IPC_ENABLEDISABLE_ALL_WINDOWS);
end;
procedure TCnWinampCtrl.SetEQData(const Index: TEQDataSelect; const Value:
Byte);
begin
SendMessageToWinamp(WM_WA_IPC, Ord(Index), IPC_GETEQDATA);
SendMessageToWinamp(WM_WA_IPC, Value, IPC_SETEQDATA);
end;
procedure TCnWinampCtrl.SetPlayListPos(const Value: Integer);
begin
SendMessageToWinamp(WM_WA_IPC, Value, IPC_SETPLAYLISTPOS)
end;
procedure TCnWinampCtrl.SetVolume(const Value: Byte);
begin
SendMessageToWinamp(WM_WA_IPC, Value, IPC_SETVOLUME);
end;
procedure TCnWinampCtrl.SetVolBalance(const Value: Integer);
begin
SendMessageToWinamp(WM_WA_IPC, Value, IPC_SETPANNING);
end;
procedure TCnWinampCtrl.SetWACurrentTime(const Value: Integer);
begin
SendMessageToWinamp(WM_WA_IPC, Value, IPC_JUMPTOTIME);
end;
procedure TCnWinampCtrl.SetWARepeat(const Value: Boolean);
begin
SendMessageToWinamp(WM_WA_IPC, Integer(Value), IPC_SET_REPEAT);
end;
procedure TCnWinampCtrl.SetWAShufle(const Value: Boolean);
begin
SendMessageToWinamp(WM_WA_IPC, Integer(Value), IPC_SET_SHUFFLE);
end;
function TCnWinampCtrl.StartWinamp(const strWAPath: string=''): Boolean;
begin
Result := False;
if strWAPath <> '' then FWAPath := strWAPath;
if not FileExists(FWAPath) then Exit;
if ShellExecute(0, '', PChar(FWAPath), PChar('/CLASS="'+WinAmpClassName+'"'),
PChar(ExtractFilePath(FWAPath)), SW_MINIMIZE) > 32 then
Result := True;
if FAutoFind then
begin
Sleep(FStartDelay);
FindWinamp;
end;
end;
procedure TCnWinampCtrl.Stop;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_BUTTON4, 0);
end;
procedure TCnWinampCtrl.VolumeDown;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_VOLUMEDOWN, 0);
end;
procedure TCnWinampCtrl.VolumeUp;
begin
SendMessageToWinamp(WM_COMMAND, WINAMP_VOLUMEUP, 0);
end;
procedure TCnWinampCtrl.WritePlayList;
begin
SendMessageToWinamp(WM_WA_IPC, 0, IPC_WRITEPLAYLIST);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -