AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kontextmenü des Explorers anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Kontextmenü des Explorers anzeigen

Offene Frage von "Exceeder"
Ein Thema von Exceeder · begonnen am 26. Aug 2009 · letzter Beitrag vom 27. Aug 2009
Antwort Antwort
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#1

Kontextmenü des Explorers anzeigen

  Alt 26. Aug 2009, 18:21
Hallo,

ich finde bei meinen Recherchen leider immer nur das Thema, wie man Einträge in das Kontextmenü des Explorers integriert. Ich suche aber eine Möglichkeit das Explorer Kontextmenü aus meiner eigenen Anwendung heraus an der aktuellen Mausposition anzuzeigen. Hat jemand einen Tipp, wie die entsprechende WinAPI Funktion lauten könnte? Den Rest finde ich dann schon heraus, nur leider fehlt mir bisher jeglicher Anhaltspunkt.

Exceeder
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Kontextmenü des Explorers anzeigen

  Alt 26. Aug 2009, 18:26
irgendwo in der DP dürften sich auch noch die Originalcodes rumliegen, aus welchen ich dieses mal erstellt hatte
Delphi-Quellcode:
  Procedure ContextMenuForFile(Wnd: HWND; FileName: String; X, Y: Integer);
    Var ContextMenu: IContextMenu;
      Popup: HMENU;
      CmdInfo: TCMInvokeCommandInfo;
      PIDL: PItemIDList;
      ShellFolder: IShellFolder;
      Eaten, Attr: LongWord;
      FileDir: String;

    Begin
      If SHGetDesktopFolder(ShellFolder) <> NO_ERROR Then Exit;
      FileDir := ExtractFileDir(FileName);
      FileName := ExtractFileName(FileName);
      If (FileDir <> '') and ((ShellFolder.ParseDisplayName(Wnd, nil, PChar(FileDir), Eaten, PIDL, Attr) <> NO_ERROR)
        or (ShellFolder.BindToObject(PIDL, nil, IID_IShellFolder, Pointer(ShellFolder)) <> NO_ERROR))
        or (ShellFolder.ParseDisplayName(Wnd, nil, PChar(FileName), Eaten, PIDL, Attr) <> NO_ERROR)
        or (ShellFolder.GetUIObjectOf(Wnd, 1, PIDL, IID_IContextMenu, nil, Pointer(ContextMenu)) <> NO_ERROR) Then Exit;
      Popup := CreatePopUpMenu;
      If Popup = 0 Then Exit;
      Try
        If Failed(ContextMenu.QueryContextMenu(Popup, 0, 1, $7FFF, CMF_NORMAL)) Then Exit;
        FillChar(CmdInfo, Sizeof(TCMInvokeCommandInfo), 0);
        CmdInfo.cbSize := SizeOf(TCMInvokeCommandInfo);
        CmdInfo.lpVerb := PAnsiChar(TrackPopupMenuEx(Popup, TPM_LEFTALIGN or TPM_RETURNCMD
          or TPM_RIGHTBUTTON or TPM_HORIZONTAL or TPM_VERTICAL, X, Y, Wnd, nil)) - 1;
        CmdInfo.nShow := SW_SHOWNORMAL;
        If CmdInfo.lpVerb = PAnsiChar(-1) Then Exit;
        ContextMenu.InvokeCommand(CmdInfo);
      Finally
        DestroyMenu(Popup);
      End;
    End;
als HWnd z.B. das Handle deiner Form
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Kontextmenü des Explorers anzeigen

  Alt 26. Aug 2009, 19:20
Vielleicht interessiert dich auch das.
Uli Gerhardt
  Mit Zitat antworten Zitat
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#4

Re: Kontextmenü des Explorers anzeigen

  Alt 27. Aug 2009, 09:23
Danke ihr beiden. Funktioniert einwandfrei. Sogar vom TrayIcon aus, wenn man als Windows Handle einfach das Application.Handle übergibt.

Exceeder
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Kontextmenü des Explorers anzeigen

  Alt 27. Aug 2009, 10:04
Zitat von Exceeder:
Danke ihr beiden. Funktioniert einwandfrei. Sogar vom TrayIcon aus, wenn man als Windows Handle einfach das Application.Handle übergibt.
ich nutzte es sogar als Untermenü eines TPopupMenu's.

was aber nicht geht und ich weiß auch nicht wieso,
ist "öffnen mit", also wenn dort schon Anwendungen als Untermenü drinstehn, werden diese zwar angezeigt und lassen sich auch auswählen, aber es wird immer der "öffnen mit..."-Dialog angezeigt
$2B or not $2B
  Mit Zitat antworten Zitat
Carnivore

Registriert seit: 17. Mär 2009
4 Beiträge
 
#6

Re: Kontextmenü des Explorers anzeigen

  Alt 27. Aug 2009, 12:03
Also wenn es ein paar Euro kosten darf, sind die ShellBrowser Komponenten von JAM Software zu empfehlen. Das "Öffnen mit ..." funktioniert zumindest mal in dem JamExplorer Beispiel, das gibt's auf der Website auch vorcompiliert.

Sehr schön finde ich auch die Möglichkeit, ein Delphi TPopupMenu anzugeben, dass dann mit dem Explorer Kontextmenü zusammen angezeigt wird. So kann man leicht eigene, programmspezifische Funktionen dem Kontextmenü hinzufügen, und steht nicht for dem "entweder / oder" Problem.

ShellTree und ShellList und weitere visuelle Controls sind auch dabei und lassen den Preis fair erscheinen, aber die brauchst Du wohl nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Kontextmenü des Explorers anzeigen

  Alt 27. Aug 2009, 12:24
Einträge einzufügen, zu ändern oder zu löschen dürfte nicht das Problem darstellen.

Wenn ich das richtig versteh, dann müßte man einfach nur zwischen dem Holen/Laden des Menüs ContextMenu.QueryContextMenu und dem Anzeigen ContextMenu.InvokeCommand(CmdInfo); diese Änderungen vornehmen
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz