zoukankan      html  css  js  c++  java
  • (C#)Windows Shell 外壳编程系列6

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)

    接上一节:(C#)Windows Shell 外壳编程系列5 - 获取图标 

    执行

        许多人都知道 ShellExecute ,用于执行一个外部命令。但对于  IShellFoloder 对象来说,它的执行命令,都在它的 ContextMenu 里面了。记得前几节说过如何直接调用 ContextMenu 里的项,因此,执行一个 IShellFoloder,也无非是调用它的 ContextMenu  里默认的项而已:

    //存放 PIDL 的数组
    IntPtr[] pidls = new IntPtr[1];
    pidls[0] = pidl;

    //得到 IContextMenu 接口
    IntPtr iContextMenuPtr = IntPtr.Zero;
    iContextMenuPtr = IParent.GetUIObjectOf(IntPtr.Zero, (uint)pidls.Length,
    pidls, ref Guids.IID_IContextMenu, out iContextMenuPtr);
    IContextMenu iContextMenu = (IContextMenu)Marshal.GetObjectForIUnknown(iContextMenuPtr);

    //提供一个弹出式菜单的句柄
    IntPtr contextMenu = API.CreatePopupMenu();
    iContextMenu.QueryContextMenu(contextMenu, 0,
    API.CMD_FIRST, API.CMD_LAST, CMF.NORMAL | CMF.EXPLORE);

    //获取默认的命令项
    int defaultCommand = API.GetMenuDefaultItem(contextMenu, false, 0);

    CMINVOKECOMMANDINFOEX invoke = new CMINVOKECOMMANDINFOEX();
    invoke.cbSize = Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX));
    invoke.lpVerb = (IntPtr)(defaultCommand - API.CMD_FIRST);
    invoke.lpDirectory = string.Empty;
    invoke.fMask = 0;
    invoke.ptInvoke = new POINT(MousePosition.X, MousePosition.Y);
    invoke.nShow = 1;
    iContextMenu.InvokeCommand(ref invoke);


    GetMenuDefaultItem 的原型:

    [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern int GetMenuDefaultItem(IntPtr hMenu, bool fByPos, uint gmdiFlags);


    一个 IShellFolder 的默认菜单一般都是“打开”,但有些却不是。所以 lpVerb 不应该直接使用 "open"。

    资源管理器

        经过把前几节中的例子修改,大致得到一个资源管理器的原型,但它还有很多问题:

    1,不会释放资源
    2,无法显示快捷方式、共享等图标标志
    3,ContextMenu 某些地方没有处理,例如发送到...
    4,拖拉没有实现
    5,没有实时监控更改

        因此,要做一个完整的资源管理器,是非常麻烦的事情,你可以参考 C# FileBrowser ,它已经做得非常好了。



    源代码:/Files/lemony/WinShell5.rar

    以后会讲述一些在资源管理器实现 Shell 操作的内容,希望大家多多支持^_^。

  • 相关阅读:
    iOS APM性能统计
    iOS promise
    静态代码检测工具Infer的部署
    ES读写数据的工作原理
    关于 Elasticsearch 内存占用及分配
    Elasticsearch中数据是如何存储的
    ES中的选举机制
    .net core 3.1 webapi解决跨域问题 GET DELETE POST PUT等
    .net framework WEBAPI跨域问题
    Angular前端项目发布到IIS
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8547405.html
Copyright © 2011-2022 走看看