Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Windows Explorer Shell Extention - mit SubMenu

  Alt 26. Sep 2011, 10:26
@All:
Nachdem ich kurzfristig etwas anderes erledigen mußte, bin ich jetzt wieder bei dieser Geschichte angekommen.
DAs Projekt kompiliert ohne Fehler unter XE2, auch für x64.
Es lässt sich auch unter X64 einwandfrei installieren/deinstallieren.

Wenn ich nur einen Menueintrag erzeuge klappt das ganze auch 100%.

Versuche ich allerdings in der function QueryContextMenu mehrere Einträge inkl. Submenus
zu erzeugen, dann kommen die Events nicht immer in function "InvokeCommand" an,
teilweise abhängig von der Dateiendung wird InvokeCommand gar nicht ausgelöst,
sondern andere System Dialogs gehen auf, z.B. auf der eigenen DLL geht ein erweitertes
Eigenschaft Fenster auf. Bei einer anderen Datei passiert gar nichts.
Bei wieder einer anderen Datei kommt der Klick in InvokeCommand an,
wahrscheinlichkeit allerdings so 1:15

Hier mein Code:
Delphi-Quellcode:
function TDemoSCPE.QueryContextMenu (Menu: HMENU;
                      indexMenu, idCmdFirst, idCmdLast, uFlags: UINT) : HResult;
const
  cMenuText = 'MyContextMenu';
var iCode : Integer;
  hMnu: HMENU;
  hMnu2: HMENU;
  //vReg: TRegistry;
  Idx: Integer;
  mii: TMenuItemInfo;

begin
  Result := 0;
  uMenuID := indexMenu;

  if ((uFlags and $0000000F) = CMF_NORMAL) or
     ((uFlags and CMF_EXPLORE) <> 0) then begin

    (*
    CreateMenu (cMenuText);  // <-- sub-Procedure die ein MenuItem erstellt
    result := 1;
    *)

    // ^^ obriger Code mit nur einem MenuItem funktioniert einwandfrei

    // Ich versuche allerdings eine Menu-Struktur aufzubauen die in etwa so aussieht:
    // MeinKontextMenü - Hauptmenüeintrag (kein Index) - kann keine Aktion auslösen
    // Menüpunkt 1 - Index 0
    // Menüpunkt 2 - Index 1
    // Menüpunkt 4 - hier kommt ein weiteres Untermenü (Index 2 - kann aber keine Aktion auslösen)
    // Untermenü - Index 3


    hMnu := CreatePopupMenu();
    AppendMenu(hMnu, MF_STRING, idCmdFirst, 'Menüpunkt 1');
    AppendMenu(hMnu, MF_STRING, idCmdFirst + 1, 'Menüpunkt 2');

    // Untermenü erzeugen - dies hat dann den "virtuellen" Index von 2
    hMnu2 := CreatePopupMenu();
    // das ist der dritte Menüpunkt
    AppendMenu(hMnu2, MF_STRING, idCmdFirst + 3, 'Untermenü');

    // Das Untermenü erhält den Text Menüpunkt 4
    mii.cbSize := sizeof(TMenuItemInfo);
    mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
    mii.wID := idCmdFirst + 2;
    mii.hSubMenu := hMnu2;
    mii.dwTypeData := PChar('Untermenü');
    InsertMenu(hMnu, idCmdFirst + 2, MF_STRING or MF_BYPOSITION or MF_POPUP, hMnu2, 'Menüpunkt 4'); // 2

    mii.cbSize := sizeof(TMenuItemInfo);
    mii.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;
    mii.wID := idCmdFirst + 4;
    mii.hSubMenu := hMnu;
    mii.dwTypeData := PChar(cMenuText);

    // die folgenden Anweisungen sind wichtig, damit das Bild korrekt erscheint.
    InsertMenuItem(Menu, indexMenu, True, mii);

    (* für das Problem nicht relevant
    if hBmp.Handle <> 0 then
      SetMenuItemBitmaps(Menu, indexMenu, MF_BYPOSITION, hBmp.Handle, hBmp.Handle);
    *)


    // Result := 4 // Anzahl der zusätzlichen Menüpunkte
    //
    iCode := idCmdFirst+4 - idCmdFirst +1;
    Result := MakeResult (SEVERITY_SUCCESS, 0, iCode);
  end; // if

  (* orginal MSDN Hilfe :

    Return value

    Type: HRESULT

    If successful, returns an HRESULT value that has its severity value
    set to SEVERITY_SUCCESS and its code value set to the offset of the largest command
    identifier that was assigned, plus one.
    For example, if idCmdFirst is set to 5 and you add three items to the menu
    with command identifiers of 5, 7, and 8, the return value should be
    MAKE_HRESULT(SEVERITY_SUCCESS, 0, 8 - 5 + 1). Otherwise, it returns a COM error value.
  *)

end;
Ich vermute das ich entweder mein Menu falsch aufbaue(Struktur wird allerdings im Explorerpopup komplett richtig dargestellt) oder das mein Result was ich zurück liefere nicht stimmt und somit
die Commands des ShellPopups durcheimnander geworfen werden.

Sieht jemand den Fehler/das Problem ?

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat