WINDOWS中右键菜单有个
发送到
  我的文档
  邮件接受者
  桌面现想实现发送到
  我的文档
  邮件接受者
  桌面
  A
  B
  C
  
  N
A。。N为动态值,分别实现不同的功能
找了一下上下文资料,没有收获。望高手指点。

解决方案 »

  1.   

    http://blog.java-cn.com/more.asp?name=ltoiii&id=237
    http://community.csdn.net/Expert/topic/4129/4129405.xml?temp=6.923854E-03在Windows中,用鼠标右键单击文件或者文件夹时弹出的那个菜单便称为上下文相关菜单。要动态地在上下文相关菜单中增添菜单项,可以通过写Context Menu Handler来实现。比如大家所熟悉的WinZip和UltraEdit等软件都是通过编写Context Menu Handler来动态地向菜单中增添菜单项的。如果系统中安装了WinZip,那么当用右键单击一个名为abc的文件(夹)时,其上下文相关菜单就会有一个名为Add to abc.zip的菜单项。本文要实现的Context Menu Handler与WinZip提供的上下文菜单相似,它将在任意类型文件的上下文菜单中增加一个名为“用写字板打开XXX”(其中XXX为当前选定的文件名称)的菜单项,只要你选择该菜单项,Windows就会启动写字板并打开当前所选的文件   编写Context Menu Handler必须实现IShellExtInit和IContextMenu两个接口。除了IUnknown接口所定义的函数之外,Context Menu Handler还需要用到QueryContextMenu、InvokeCommand和GetCommandString这三个非常重要的成员函数。   (1)QueryContextMenu函数:每当系统要显示一个文件对象的上下文相关菜单时,它首先要调用该函数。为了在上下文相关菜单中添加菜单项,我们在该函数中调用InsertMenu函数。   (2)InvokeCommand函数:当用户选定了某个Context Menu Handler登记过的菜单项后,该函数将会被调用,系统将会传给该函数一个指向LPCMINVOKECOMMANDINFO结构的指针。在该函数中要执行与所选菜单项相对应的操作。   (3)GetCommandString函数:当鼠标指针移到一个上下文相关菜单项上时,在当前窗口的状态条上将会出现与该菜单项相关的帮助信息,此信息就是系统通过调用该函数获取的。   具体编写方法请参阅网上的程序实例,网址为www.pccomputing.com.cn。   3.增添上下文相关菜单项说明   如果要静态地为目录或者某一类文件增添上下文相关菜单项,那么就用不着编写Context Menu Handler,可以通过直接修改Windows注册表来达到此目的。比如,可以将下面的内容存成一个扩展名为.REG的文件,然后双击它将其导入注册表,你会发现所有类型文件的上下文相关菜单中都多了一个名叫“记事本”的菜单项。   REGEDIT4   [HKEY_CLASSES_ROOT\*\shell\记事本]   [HKEY_CLASSES_ROOT\*\shell\记事本\command]   @="notepad.exe\"%1\""   通过比较,很容易发现这两种方式所得结果的差异。通过直接修改注册表来增添菜单项的确比较简单,然而它不具有交互性,所增添的菜单项是静态的,并且所能实现的功能也非常有限。但是Context Menu Handler则不同,它使我们可以根据上下文的具体情况动态地添加菜单项,比如可以判断当前选定的是哪一类文件、是不是文件夹、选定的文件(夹)的个数以及获取被选定文件(夹)的属性。有时,这些信息对于程序很有用,如果需要得到此类信息,并且需要根据不同的上下文来执行不同的操作,那么只好依靠Context Menu Hander来实现。本文的实例中,其动态性体现在仅当用户选定了一个文件时,才会在上下文相关菜单中增添菜单项,并且菜单项的名字随着所选文件名的不同而相应地变化。
      

  2.   

    在shell建立一个MyApp的项,然后在MyApp下建一个command的项,运行下面的代码,试试看procedure TForm1.FormCreate(Sender: TObject);
    var
        reg:TRegistry;
    begin
        reg:=TRegistry.Create;
        reg.RootKey:=HKEY_CLASSES_ROOT;
        if reg.OpenKey('*\shell\MyApp',true) then
        begin
            reg.WriteString('','What is this?');
            reg.Closekey;
        end;
        if reg.openkey('*\shell\MyApp\command',true) then
        begin
            reg.WriteString('',Application.Exename+' %1');
            reg.Closekey;
        end;
        reg.free;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
        reg:TRegistry;
    begin
        reg:=TRegistry.create;
        reg.RootKey:=HKEY_CLASSES_ROOT;
        reg.DeleteKey('*\shell\MyApp');
        reg.Free;
    end;
      

  3.   

    我会用GOOGLE的
    =========
    小样,会用google还找不到资料?
      

  4.   

    xixuemao(俺可是㊣②㈧经儿滴人) 
    我明白的。主要是二级菜单不知道怎么实现。
      

  5.   

    我用最简单的办法:
    在系统文件夹sendto里建立快捷方式,然后右键时就可以看到发送到里多了东西了。
      

  6.   

    呵呵,楼主还挺拽,
    死要面子,不会就不会,
    一会“明白”一会又“不知道”的,累不累?还是用google搜的,不过是VC的代码《Windows Shell扩展编程完全指南》
    第六节-如何编写定制”发送到”菜单的Shell扩展......剩余的细节是要在发送到文件夹中创建一个文件好让显示我们的菜单项 .
    我们可以在 DllRegisterServer() 中完成并在 DllUnregisterServer() 中删除文件. 
    下面是创建文件的代码:
    LPITEMIDLIST  pidl;
    TCHAR szSendtoPath [MAX_PATH];
    HANDLE hFile;
    LPMALLOC pMalloc;
                 
    if ( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_SENDTO, &pidl)))
       {         if ( SHGetPathFromIDList ( pidl, szSendtoPath ))
               {                PathAppend ( szSendtoPath, _T("Some other folder.SendToClone") );              
                    hFile = CreateFile ( szSendtoPath, GENERIC_WRITE, FILE_SHARE_READ,                         NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 
                    CloseHandle ( hFile );
                }
            if ( SUCCEEDED( SHGetMalloc ( &pMalloc ))) 
                {               pMalloc->Free ( pidl ); 
                   pMalloc->Release();
                }
       }
     下面是发送菜单的样子:DllUnregisterServer() 删除”发送到”文件夹中的文件.
    上面的代码对任何版本的 Windows 都适用
    如果你事先知道你的代码会在高于Shell 4.71版本的情况下运行, 你可以使用 SHGetSpecialFolderPath() 函数而不用 SHGetSpecialFolderLocation()......
      

  7.   

    靠。最讨厌的就是你这种人,到处COPY。
      

  8.   

    天下文章一大抄,我不觉得copy有什么丢人的,
    某些人连去哪里抄都不知道你也别靠啊草的
    要论起国骂,我甘拜下风恶心你几句,只是提醒你,别死要面子
    有问题就问,用不着提醒别人你“明白”“会用”