AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi windows eigenschaften-dialog für datenträger anzeigen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

windows eigenschaften-dialog für datenträger anzeigen lassen

Ein Thema von KodeZwerg · begonnen am 4. Jun 2020 · letzter Beitrag vom 22. Jul 2020
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 4. Jun 2020, 07:31
Guten Tag liebe Delphi Gemeinde!

Ich stehe irgendwie mal wieder vor einem Problem, vielleicht ist es was total einfaches, nur komme ich einfach nicht auf einen grünen Zweig....
Folgendes von swissdelphicenter.ch ist gegeben:
Delphi-Quellcode:
{ This code shows the standard file properties dialog like in Windows Explorer }

uses
  shellapi;

// Thanks to Peter Below (TeamB) for this code
procedure PropertiesDialog(FileName: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.lpFile := PChar(FileName);
  sei.lpVerb := 'properties';
  sei.fMask := SEE_MASK_INVOKEIDLIST;
  ShellExecuteEx(@sei);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if Opendialog1.Execute then
    PropertiesDialog(Opendialog1.FileName);
end;
Bei Microsoft werde ich einfach nicht fündig wie man den Laufwerks-Eigenschaften-Dialog anzeigen lassen kann.
Weiß jemand wie das geht und kann mich vielleicht in die richtige Richtung stubsen?

Danke für's lesen und jeden Tipp!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.937 Beiträge
 
Delphi 12 Athens
 
#2

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 4. Jun 2020, 14:19
Hilft das weiter ?

Es scheint so das statt
  sei.lpVerb := 'properties'; das hier gebraucht würde.

  sei.nShow = SW_SHOW;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 5. Jun 2020, 07:07
Vielen Dank für diesen Tipp, werde ich heut abend gleich mal ausprobieren, Danke danke!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 22. Jun 2020, 08:08
Hallo nochmal, also ich war in dem moment als ich das posting erstellte selbst nicht auf dem laufenden... Entschuldigung!
(mein code ist noch sehr unübersichtlich, unsortiert und kaum lesbar...)

Der original code funktioniert einwandfrei, auch auf laufwerke.
Mein problem ist zwar schon der "Eigenschaften-Dialog", allerdings auf einer anderen ebene.
Ich poste morgen meinen Code (samt beispielanwendung).

Ich benutze per Windows-Api das Kontext-Menu von Windows für Dateien und Verzeichnisse sowie auch Laufwerke.
Bei Dateien und Ordner sowie auch Laufwerke öffnet sich das Windows-Menu wie gewünscht.
Alles was das Kontext-Menu bietet wird, soweit mir bekannt, sauber und fehlerfrei abgearbeitet, nur eben bei Laufwerken erscheint nicht der Eigenschaften-Dialog.
(ich habe momentan eine fail-safe sache reingebastelt, an der ich hoffe auf eine lösung zu kommen)

Bis morgen in alter frische.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 23. Jun 2020, 07:36
Guten Morgen/Tag/Abend, hier jetzt mein Code-Problem wie oben beschrieben:

Delphi-Quellcode:
// hier ist mein problem-kind
procedure TMain.InvokeContextMenu(const Owner: TWinControl; const Path: String;
  const X, Y: Integer);
var
  // Item: Integer;
  DeskFolder, Folder: IShellFolder;
  Eaten, Attributes: ULONG;
  PIDL, FolderpIdl: PItemIDList;
  Menu: HMENU;
  Pos: TPoint;
  Cmd: DWORD;
  CommandInfo: TCMInvokeCommandInfo;
  ContextMenu: IContextMenu;
  ContextMenu2: IContextMenu2;
  ContextMenu3: IContextMenu3;
  APath: String;
  aFileName: String;
  aDrive: String;
  aContextMenu: Boolean;
begin
  ContextMenu2 := nil;
  ContextMenu3 := nil;
  aContextMenu := False;

  aDrive := ExtractFileDrive(Path);

  APath := ExtractFilePath(Path);
  if (APath = aDrive) then
    APath := IncludeTrailingPathDelimiter(APath);

  aFileName := ExtractFileName(Path);

  // IShellFolder for Desktop folder (root)
  if Succeeded(SHGetDesktopFolder(DeskFolder)) then
  begin
    // Item ID List for the folder that the file or folder is in
    Attributes := 0;
    if Succeeded(DeskFolder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
      PWideChar(WideString(APath)), Eaten, FolderpIdl, Attributes)) then
    begin
      // IShellFolder for the folder the file is in
      Attributes := 0;
      if Succeeded(DeskFolder.BindToObject(FolderpIdl, nil, IShellFolder,
        Folder)) then
        if (Length(aFileName) > 0) then
          // Item ID List for the file or folder, relative to the folder it is in
          if Succeeded(Folder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
            PWideChar(WideString(aFileName)), Eaten, PIDL, Attributes)) then
          begin
            // connect IContextMenu with local PIDL ContextMenu
            aContextMenu := Succeeded(Folder.GetUIObjectOf(INVALID_HANDLE_VALUE,
              1, PIDL, IContextMenu, nil, ContextMenu));
            CoTaskMemFree(PIDL);
          end;
      // try to fallback to system context menu
     // an dieser stelle hüpft der code wenn man "Eigenschaften" von Laufwerken auswählt.
      if (not aContextMenu) then
        // connect IContextMenu with local FolderPIDL ContextMenu
        aContextMenu := Succeeded(DeskFolder.GetUIObjectOf(INVALID_HANDLE_VALUE,
          1, FolderpIdl, IContextMenu, nil, ContextMenu));
      CoTaskMemFree(FolderpIdl);
    end;
  end;

  if (not aContextMenu) then
    Exit;

  Menu := CreatePopupMenu;
  try
    // Populate our menu with shortcut items
    if (Cardinal(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE))
      and $80000000) = 0 then
    begin
      // ContextMenu2 used in WndProc
      if (ContextMenu.QueryInterface(IContextMenu2, ContextMenu2) = NO_ERROR) or
        (ContextMenu.QueryInterface(IContextMenu3, ContextMenu3) = NO_ERROR)
      then
        try
          Pos.X := X;
          Pos.Y := Y;
          Winapi.Windows.ClientToScreen(Owner.Handle, Pos);
          // launch the menu
          Bool(Cmd) := TrackPopupMenu(Menu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON or
            TPM_RETURNCMD, Pos.X, Pos.Y, 0, Handle, nil);
        finally
          // clear so that we don't intervene every owner drawn menu item message in
          // WndProc
          ContextMenu2 := nil;
          ContextMenu3 := nil;
        end;

      // Invoke command if we have one
      if Bool(Cmd) then
      begin
        FillChar(CommandInfo, SizeOf(CommandInfo), 0);
        CommandInfo.cbSize := SizeOf(CommandInfo);
        CommandInfo.HWnd := Handle;
        CommandInfo.lpVerb := PAnsiChar(MakeIntResource(Cmd - 1));
        CommandInfo.fMask := CMIC_MASK_ICON or CMIC_MASK_UNICODE or
          CMIC_MASK_ASYNCOK or CMIC_MASK_NOZONECHECKS;
        CommandInfo.nShow := SW_SHOWNORMAL;
        OleCheck(ContextMenu.InvokeCommand(CommandInfo));
      end;
    end;

  finally
    DestroyMenu(Menu);
  end;
end;

// das menu wird hiermit eingeleitet.
// es wird immer der komplette pfad übermittelt.
// für laufwerke wird der slash abgeschnitten.
procedure TMain.LeftViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  S: String;
begin
  if Button = mbRight then
    if LeftView.Selected <> nil then
    begin
      S := LeftShellItem(LeftView.Selected.Index).FullPath;
      if S[Length(S)] = '\then
        S := Copy(S, 1, Length(S) - 1);
      InvokeContextMenu(Self, S, X, Y);
    end;
end;
Im Beispiel Anhang ist unten ein "F9" Knopf drückbar (nicht per Hotkey) der auf meine erste Post verweist, da hatte ich mich geirrt, verzeihung nochmal.
Zur Vollständigkeit hier der "F9" Knopf:

Delphi-Quellcode:
// der "F9" Knopf-Code, funktioniert 1A

procedure TMain.BTN_F09Click(Sender: TObject);
begin
  if LeftView.Selected <> nil then
    ShellExec(LeftShellItem(LeftView.Selected.Index).FullPath, 'properties');
end;

function ShellExec(const PIDL: PItemIDList; const Operation: string)
  : Boolean; overload;
var
  SEI: TShellExecuteInfo;
  Path: array [0 .. 512] of WideChar;
begin
  Result := False;
  if SHGetPathFromIDList(PIDL, @Path) then
  begin
    FillChar(SEI, SizeOf(SEI), 0);
    SEI.Wnd := GetActiveWindow();
    SEI.cbSize := SizeOf(SEI);
    SEI.lpFile := PChar(@Path);
    SEI.lpVerb := PChar(Operation);
    SEI.fMask := SEE_MASK_INVOKEIDLIST;
    SEI.nShow := SW_SHOWNORMAL;
    Result := ShellExecuteEx(@SEI);
  end;
end;
Danke für's Lesen!


Der Anhang ist nur ein Kompilat, ohne Quelltext, da noch mörderisch in Entwicklung.
Benutzt wird Delphi Rio.
Angehängte Dateien
Dateityp: 7z Invoke.7z (878,2 KB, 5x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: windows eigenschaften-dialog für datenträger anzeigen lassen

  Alt 29. Jun 2020, 07:24
*stubs an, falls jemand eine Idee hat bitte melden...*
Gruß vom KodeZwerg
  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 12:18 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