![]() |
Programm in Kontextmenü eintragen
Hallo erstmal,
ich hab nen kleinen MP3 Player geschrieben und hätte nun gerne wie bei Winamp einen Eintrag im Kontextmenü von .mp3 Dateien "Datei zu Playlist hinzufügen" oder so ähnlich. Das ganze soll dann so funktionieren, dass wenn mein Programm läuft die Datei einfach in die Playlist (ListBox) hinzugefügt wird. Hoffe mir kann hierbei einer helfen. Gruß Flo |
Re: Programm in Kontextmenü eintragen
Moin,
dazu musst du einen Registry-Eintrag vornehmen. Welche Schlüssel du brauchst und was du beachten musst erfährst du in meinen Tutorial: ![]() Bye |
Re: Programm in Kontextmenü eintragen
Das kann man mit einer ShellExtension lösen. Siehe dazu das Beispiel das bei Delphi dabei ist unter
Code:
Mit dieser ShellExtenstion kannst du dann z.B. dein Programm aufrufen mittels eines Parameters zum hinzufügen einer Datei zur Playlist, z.B. mit "-addtoplaylist <MP3Datei>".
<Delphi Verzeichnis>\Demos\ActiveX\ShellExt\
Alternativ kannst du auch einen einfachen Registry eintrag vornehmen wenn
Code:
Dein Programm muss dazu den Parameter "-addtoplaylist <MP3Datei>" verarbeiten.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.mp3] @="MeinMP3Player" [HKEY_CLASSES_ROOT\MeinMP3Player] @="MP3 Datei" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 [HKEY_CLASSES_ROOT\MeinMP3Player\DefaultIcon] @="C:\\Programme\\MeinMP3Player\\MeinMP3Player.exe,0" [HKEY_CLASSES_ROOT\MeinMP3Player\shell] @="" [HKEY_CLASSES_ROOT\MeinMP3Player\shell\Zur Playlist hinzufügen] [HKEY_CLASSES_ROOT\MeinMP3Player\shell\Zur Playlist hinzufügen\command] @="\"C:\\Programme\\MeinMP3Player\\MeinMP3Player.exe\" -addtoplaylist \"%1\"" Dabei wird (wie im ersten Fall) jedoch jedesmal eine neue Instanz deines Players gestartet. Das musst du dann abfangen und den Befehl, eine neue MP3Datei zur Playliste hinzuzufügen, an die bereits laufende Instanz weitergeben. rantanplan //edit: oh, wie ich sehe hat onlinehome dir das mit der Registry schon geschrieben wären ich getippt habe. |
Re: Programm in Kontextmenü eintragen
Erstmal danke für alle Tipps soweit.
Leider funktioniert das mit dem Registry Key nicht so richtig. Habe irgendwo gelesen, dass es unter anderem an Winamp liegen kann, habe deshalb Winamp mal deinstalliert, der Eintrag erscheint aber dennoch nicht. Bei einer Textdatei funktioniert die Registry Methode. Woran kann es noch liegen? |
Re: Programm in Kontextmenü eintragen
so dieses problem konnte ich nun lösen un hab sogar winamp wieder installieren können.
leider hören die probleme damit nicht auf, sondern scheinen erst richtig loszugehen. also den parameter übergeb ich meinem prog mit diesem registrywert: "D:\Desktop\Desktop.exe""%1" mein programmcode sieht so aus:
Delphi-Quellcode:
(habe noch einen splash screen eingebaut)
var
ExtendedStyle : Integer; dwMutex : DWORD; hWindow : DWORD; cdWork : TcsCopyDataStruct; begin dwMessage := RegisterWindowMessage('{0F08433D-ADFB-4918-AE2D-8839BAC93392}'); dwMutex := CreateMutex(nil,true,'Desktop'); try if GetLastError <> ERROR_ALREADY_EXISTS then begin Form16 := TForm16.Create(Application); try ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE); SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW); Form16.Show; Form16.Refresh; Application.Initialize; Application.Title := 'Desktop'; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); finally Form16.InitializationDone := True; end; Application.Run; end else begin hWindow := FindWindow(nil,'Desktop'); if hWindow <> 0 then begin if (paramcount > 0) and FileExists(paramstr(1)) then begin cdWork.dwData := dwMessage; cdWork.cbData := Length(paramstr(1))+1; cdWork.lpData := AllocMem(cdWork.cbData); try CopyMemory(cdWork.lpData,@paramstr(1)[1],cdWork.cbData-1); SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork)); finally FreeMem(cdWork.lpData,cdWork.cbData); end; end; end; end; finally if dwMutex <> 0 then begin CloseHandle(dwMutex); end; end; end. und der code in meiner main unit sieht wie folgt aus:
Delphi-Quellcode:
fehlermeldungen bringt er keine, aber in die listboxen wird auch nichts eingetragen.
procedure TForm1.WndProc(var msg : TMessage);
var cdWork : PcsCopyDataStruct; sec, min: Integer; s1, s2, result: String; begin if msg.Msg = WM_COPYDATA then begin cdWork := PcsCopyDataStruct(msg.lParam); if cdWork.dwData = dwMessage then begin ListBox2.Items.Add(PChar(cdWork.lpData)); ListBox5.Items.Add(ExtractFileName(PChar(cdWork.lpData))); ListBox7.Items.Add(IntToStr(Form1.ListBox5.Count)); if MPEGaudio.ReadFromFile(PChar(cdWork.lpData)) then if MPEGaudio.Valid then begin sec := round(MPEGaudio.Duration); min := sec div 60; sec := (sec - min * 60); if min >9 then s1 := intToStr(min) else s1 := intToStr(min); if sec >9 then s2 := intToStr(sec) else s2 := '0' + intToStr(sec); result := S1 + ':' + S2; ListBox8.Items.Add(''+result+''); end; Sort(ListBox5, ListBox8, ListBox2); HorScrollBar(ListBox5, 68); HorScrollBar(ListBox7, 18); HorScrollBar(ListBox8, 29); ShowScrollBar(ListBox5.Handle, SB_VERT, FALSE); ShowScrollBar(ListBox7.Handle, SB_VERT, FALSE); end; end else begin inherited WndProc(msg); end; end; danke für eure hilfe Flo |
Re: Programm in Kontextmenü eintragen
Moin Flo,
wenn der Eintrag in der Registry tatsächlich so aussieht, wie Du ihn gepostet hast, dann fehlt ein Blank zwischen den beiden mittleren " So müsste es gehen: "D:\Desktop\Desktop.exe" "%1" |
Re: Programm in Kontextmenü eintragen
hab es in der registry nun umgeändert. leider passiert immer noch nichts. wenn ich den eintrag anklicke, bekommt mein mauszeiger kurzzeitig eine sanduhr, im programm hat sich jedoch nichts verändert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz