@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.