Propozycja @hzmzp jest według mnie za bardzo inwazyjna, bo zamykamy i otwieramy ponownie program co może potrwać. Natomiast @kAzek napisał o WinAMPie albo sugerując się jego działaniem albo moim kodem. Natomiast pytanie jest o VLC. Który może faktycznie działać inaczej. Chociaż jeżeli przez dwuklik z exploratora jest ok. To podejrzewał bym albo wywoływanie z odpowiednimi parametrami poza nazwą pliku. Albo inną domyślną czynnośc niż open
. Albo obsługę DDE. Niestety w nowszych Windowsach o ile się orientuje skopano względem XP trochę ustawianie i podgląd skojarzonych rozszerzeń. Także takie operacje jak podgląd albo zmiana domyślnej czynności i innych ustawień najlepiej dokonać w Rejetrze - konkretnie dla HKEY_CLASSES_ROOT\.FLV
, a później dla klucza, który jest w nazwie domyślnej oczywiście.
EDIT: o - poniżej elegancki kod na zasymulowanie przerzucenia plików. Trzeba sobie tylko ustalić uchawyt okna VLC za pewne. Bo chyba obsługuje ono Drag and Drog. To może będzie to jakieś rozwiązanie: http://www.vbforums.com/showthread.php?632732-Simulate-Drop-Files-with-SendMessage-WM_DROPFILES o ile się nie uda inaczej.
EDIT #2: zgodnie z informacją zawartą w treści wątku na: http://us.generation-nt.com/an[...]les-message-help-57315072.html - powyższy kod na symulowanie WM_DROPFILES
zadziała, tylko trzeba użyć PostMessage
zamiast SendMessage
.
EDIT #3: powyższe kombinacje jednak źle działają dla więcej niż jednego pliku, a dodawanie do długości zmiennej Run
nawet +1
powoduje obsługe ok po pierwszym uruchomieniu WinAMP'a. Nie analizowałem zmian, ale ten kod, który pochodzi ze strony: http://www.delphi-zone.com/2010/02/how-to-send-data-to-another-program-by-auto-dragdrop sprawdza się znakomicie, a i ma ten plus, że jest już przyszłościowo pod kątem WinAMP ;) Oczywiście nie problem prxerobić go na skorzystanie z TStringList
i VCL. Poniżej przykład dla szybkich testów. Zakładam, że takie pliki jak ja macie w media. Przynajmniej pod siódemką takowe są.
Kopiuj
uses
ShellApi;
function MakeDrop(const FileNames : array of string) : THandle;
var
P : PChar;
Data : PDragInfoA;
I, Size : Integer;
begin
Size := SizeOf(TDragInfoA) + 1;
for I := 0 to High(FileNames) do
begin
Inc(Size, Length(FileNames[I]) + 1);
end;
Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
if Result <> 0 then
begin
Data := GlobalLock(Result);
if Data <> nil then
try
Data.uSize := SizeOf(TDragInfoA);
P := PChar(@Data.grfKeyState) + 4;
Data.lpFileList := P;
for I := 0 to High(FileNames) do
begin
Size := Length(FileNames[I]);
Move(Pointer(FileNames[I])^, P^, Size);
Inc(P, Size + 1);
end;
finally
GlobalUnlock(Result);
end
else
begin
GlobalFree(Result);
Result := 0;
end;
end;
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
Application.Title := Caption;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
H : HWND;
Drop : HDrop;
begin
H := FindWindow('Winamp v1.x', nil);
if H > 0 then
begin
Drop := MakeDrop
(['C:\WINDOWS\MEDIA\flourish.mid',
'C:\WINDOWS\MEDIA\town.mid',
'C:\WINDOWS\MEDIA\chord.wav']);
if Drop <> 0 then
begin
PostMessage(H, WM_DropFiles, Drop, 0);
end;
GlobalFree(Drop);
end;
end;