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/)
-   -   Explorer Menü für mehrere Dateien? (https://www.delphipraxis.net/202118-explorer-menue-fuer-mehrere-dateien.html)

MicMic 30. Sep 2019 17:03

Explorer Menü für mehrere Dateien?
 
Hallo,

folgenden Code habe ich aus dem Internet.
Mit der Funktion kann man das Explorer Popup-Menü öffen. Zumindest für eine Datei oder ein Verzeichnis (Parameter aFile).
Weiß vielleicht jemand, wie man mehrere Dateien und oder Verzeichnisse übergibt?

Gruß Mic

Delphi-Quellcode:
procedure ShowSysPopup(aFile: string; x, y: integer; HND: HWND);
var
  Root: IShellFolder;
  ShellParentFolder: IShellFolder;
  chEaten,dwAttributes: ULONG;
  FilePIDL,ParentFolderPIDL: PItemIDList;
  CM: IContextMenu;
  Menu: HMenu;
  Command: LongBool;
  ICM2: IContextMenu2;

  ICI: TCMInvokeCommandInfo;
  ICmd: integer;
  P: TPoint;
Begin
  OleCheck(SHGetDesktopFolder(Root));//Get the Desktop IShellFolder interface

  OleCheck(Root.ParseDisplayName(HND, nil,
    PWideChar(WideString(ExtractFilePath(aFile))),
    chEaten, ParentFolderPIDL, dwAttributes)); // Get the PItemIDList of the parent folder

  OleCheck(Root.BindToObject(ParentFolderPIDL, nil, IShellFolder,
  ShellParentFolder)); // Get the IShellFolder Interface of the Parent Folder

  OleCheck(ShellParentFolder.ParseDisplayName(HND, nil,
    PWideChar(WideString(ExtractFileName(aFile))),
    chEaten, FilePIDL, dwAttributes)); // Get the relative PItemIDList of the File

  ShellParentFolder.GetUIObjectOf(HND, 1, FilePIDL, IID_IContextMenu, nil, CM); // get the IContextMenu Interace for the file

  if CM = nil then Exit;
  P.X := X;
  P.Y := Y;

  ClientToScreen(HND, P);

  Menu := CreatePopupMenu;

  try
    CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
    CM.QueryInterface(IID_IContextMenu2, ICM2); //To handle submenus.
    try
      Command := TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or
        TPM_RETURNCMD, p.X, p.Y, 0, HND, nil);
    finally
      ICM2 := nil;
    end;

    if Command then
    begin
      ICmd := LongInt(Command) - 1;
      FillChar(ICI, SizeOf(ICI), #0);
      with ICI do
      begin
        cbSize := SizeOf(ICI);
        hWND := 0;
        lpVerb := MakeIntResourceA(ICmd);
        nShow := SW_SHOWNORMAL;
      end;
      CM.InvokeCommand(ICI);
    end;
  finally
     DestroyMenu(Menu)
  end;
End;

MicMic 1. Okt 2019 08:38

AW: Explorer Menü für mehrere Dateien?
 
Also ich will einfach das Menü haben, so wie's der Explorer nutzt.
Und bei mehrere markierten Dateien/Verzeichnissen, schaut dann z.B. das Popup-Menü anders aus.
Dort im Menü sind dann auch manchmal andere Menüpunkte vorhanden. Je nachdem was auf dem Rechner so installiert ist.

Ich habe jetzt auch was gefunden:
https://stackoverflow.com/questions/...783104#3783104

Das schaut jedenfalls so aus, als wäre es das richtige. Aber habe noch Probleme, wegen AnsiChar/WideChar und andere Fehler. Das wurde wohl für eine andere ältere Delphi Version geschrieben. Ich nutzte Delphi 10.3

Überlege schon, es ganz selber zu machen und mir die erforderlichen Infos aus der Registry zu holen. Z.B. wegen "Senden an..." oder wenn ein Viruskiller installiert ist, damit dieser dann auch im Menü angezeigt wird. Z.B. zeigt bei mir der Explorer (in einem Kontextmenü) "mit Windows Defender überprüfen" an. Die Infos zum Menü werden wohl alle irgendwo in der Registry stehen. Aber ob das der richtige Weg ist? Das Beispiel von "stackoverflow.com" läuft halt nicht auf anhieb und da jetzt schnell durchzusteigen... im Hirn ist grad viel zu viel Source. :)

Mic

MicMic 1. Okt 2019 18:58

AW: Explorer Menü für mehrere Dateien?
 
Inzwischen habe ich viel ausprobiert aber nicht so zum laufen bekommen. Trotzdem Danke für deine Hilfe wegen Char/Widechar etc.
Aber etwas anderes habe ich inzwischen gefunden.
Vielleicht für andere auch nützlich. Damit geht's dann mit mehreren Dateien.

http://blog.issamsoft.com/?q=en/node/65

Jedoch ist bei mir z.B. das "Öffnen mit" leer. Zum Beispiel bei einer TXT Datei. Beim Explorer habe ich dagegen dann mehrere Auswahlmöglichkeiten.
Das Problem im letzten Kommentar auf der Seite, ist bei mir auch. Also wenn man z.B. nur "C:\" übergibt. Dann geht es nicht und macht ein Fehler.
Trotzdem geht es recht gut. Wobei ich dann z.B. der Menüpunkt "Löschen" gerne noch zuvor abfangen würde... also ein Dialog einbauen würde, ob der User wirklich löschen will. Auch der Menüpunkt "Umbenennen"... da muss ich mich ja dann selbst drum kümmern und eine Funktion zum umbenennen anbieten. Habe aber jetzt noch nicht geschaut, wie ich da einen gewählten Menüpunkt abfragen kann.

Auch eine andere Seite... ist vielleicht Interesant für andere.

https://www.zabkat.com/2xExplorer/sh...s_context.html

Da steht viel über dieses Kontextmenü und wie das alles im einzelnen funktioniert. Ich nutze immer den Google Übersetzer... hach hab ich schon gesucht. Auch wurde ich schon oft von Google für die Übersetzung gesperrt. :) einfach weil ich zu viel übersetzen lassen wollte :) Trotzdem verstehe ich nur ein viertel *lol

Aber das ist ja noch nicht alles. Bei so einem Menü würde ich dann gerne noch eigene Menüpunkte einfügen. Kein Plan :)
Ich suche halt immer so das Internet durch und nutze Keywords wie "TrackPopupMenu", "IID_IContextMenu" und finde somit manchmal was brauchbares, was sich leicht anpassen kann. Aber mit dem Kontextmenü... ist dann schon ne große Nummer. Ob ich da noch alles zusammensuchen kann?... alles nicht einfach (für mich).

Mic


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