From internet sources (mostly from
http://bcbjournal.org/articles/vol4/0006/Using_the_shell_context_menu.htm )
I have scraped together a routine to display
the Windows context menu for a given file or directory name (see below).
This works okay but (at least) one issue appears:

On Windows XP, when clicking on the context menu entry "Send to" another submenu 
"Send to"
is shown instead of a list of programs to select. When clicking on this second "Send 
to" nothing happens.
On Windows 7 everything works ok and the list of programs is displayed!
Also, selecting other entries like "Properties" work ok on both platforms.

Any Windows gurus who know why this is the case (and how to fix it)?



//-------------------------------------------------------------------------------------
procedure FileShowContextMenuOK(Handle : HWND; const Path,Name : UTF8String; 
const PosX,PosY : SizeInt);
var DesktopFolder : IShellFolder = nil;
    ParentFolder  : IShellFolder = nil;
    Attr,
    Eaten,
    Flags         : DWord;
    B             : WinBool;
    CM            : IContextMenu;
    CI            : TCMINVOKECOMMANDINFO;
    hM            : HMENU;
    WidePath,
    WideName      : WideString;
    Pidl,
    ParentPidl    : LPITEMIDLIST;

begin // FileShowContextMenuOK
SHGetDesktopFolder(DesktopFolder);
if not assigned(DesktopFolder) then
   Exit;
WidePath := UTF8Decode(Path);
Attr     := 0;
if 
DesktopFolder.ParseDisplayName(Handle,nil,pwidechar(WidePath),Eaten,ParentPidl,Attr)<>0
 then
   Exit;
if DesktopFolder.BindToObject(ParentPidl,nil,IID_IShellFolder,ParentFolder)<>0 
then
   Exit;
WideName := UTF8Decode(Name);
if 
ParentFolder.ParseDisplayName(Handle,nil,pwidechar(WideName),Eaten,Pidl,Attr)<>0
 then
   Exit;
if ParentFolder.GetUIObjectOf(Handle,1,Pidl,IID_IContextMenu,nil,CM)<>0 then
   Exit;
hM    := CreatePopupMenu;
Flags := CMF_EXTENDEDVERBS; //CMF_EXPLORE; // CMF_NORMAL; //CMF_ASYNCVERBSTATE; 
// CMF_EXPLORE;
CM.QueryContextMenu(hM,0,1,$7FFF,Flags);
B := TrackPopupMenu(hM,TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or 
TPM_RETURNCMD { or TPM_NONOTIFY or TPM_RETURNCMD},
                    PosX,PosY,0,Handle,nil);
if not B then
   exit;
fillchar(CI,sizeof(CI),0);
with CI do
   begin
   cbSize       := SizeOf(CI);
   lpVerb       := MAKEINTRESOURCE(Integer(B)-1);
   lpParameters := '';
   lpDirectory  := '';
   hwnd         := Handle;
   nShow        := SW_SHOWNORMAL;
   end;
CM.InvokeCommand(CI);
CoTaskMemFree(Pidl);
CoTaskMemFree(ParentPidl);
end;  // FileShowContextMenuOK
//-------------------------------------------------------------------------------------


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to