Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kontextmenü des Explorers anzeigen (https://www.delphipraxis.net/139323-kontextmenue-des-explorers-anzeigen.html)

Exceeder 26. Aug 2009 17:21


Kontextmenü des Explorers anzeigen
 
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

himitsu 26. Aug 2009 17:26

Re: Kontextmenü des Explorers anzeigen
 
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

uligerhardt 26. Aug 2009 18:20

Re: Kontextmenü des Explorers anzeigen
 
Vielleicht interessiert dich auch das.

Exceeder 27. Aug 2009 08:23

Re: Kontextmenü des Explorers anzeigen
 
Danke ihr beiden. Funktioniert einwandfrei. Sogar vom TrayIcon aus, wenn man als Windows Handle einfach das Application.Handle übergibt.

Exceeder

himitsu 27. Aug 2009 09:04

Re: Kontextmenü des Explorers anzeigen
 
Zitat:

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 :?

Carnivore 27. Aug 2009 11:03

Re: Kontextmenü des Explorers anzeigen
 
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.

himitsu 27. Aug 2009 11:24

Re: Kontextmenü des Explorers anzeigen
 
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 :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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