(C#)Windows Shell 外壳编程系列6 - 执行

原文(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 操作的内容,希望大家多多支持^_^。

 

时间: 2024-08-04 08:05:42

(C#)Windows Shell 外壳编程系列6 - 执行的相关文章

(C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单

原文 (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单   (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列6 - 执行   从本节起,我所要讲述的是对 Windows 系统的"Shell 扩展"."Shell 扩展"从字面上分两个部分:Shell 与 Extension.Shell 指 Windows Explorer,而Extensi

(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?

原文 (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标? (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单   关于注册 动态库必须注册才能使用.除了使用 regasm 来注册 DLL 以外,还应该在代码中增加 RegisterServer 和 UnregisterServer 方法,以指导 DLL 注册时,在 Windows 注册表中增加什么

(C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示

原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?   QueryInfo扩展 活动桌面引入一项新特性,当你在某些特定对象上旋停鼠标时,工具提示将显示它们的描述.我们可以使用 QueryInfo 扩展为Shell中的其它对象提供自定义的工具提示.如下图: 事实上,这个功能实现比前两个 Shell 扩展

【转】Windows Shell扩展编程傻瓜手册大全:上下文菜单扩展

引用自:http://blog.163.com/yesaidu@126/blog/static/51819307200861853827582/ Part I: A step-by-step tutorial on writing shell extensions 第一节:Windows shell扩展初步:上下文菜单扩展   作者:Michael Dunn 译者:yesaidu   源代码下载:1       2   目录 ● README ● 系列绪言 ● 第一部分绪言 ● 从AppWiza

VC 向windows系统菜单中添加菜单项---Windows shell扩展编程

vs2008的方法和vc6.0做法几乎一样.下面是转载一位新浪博客-丢丢的.   打开VC6,新建一个工程,选ATL COM APPWIZARD,工程名写BlogTest.然后OK.如果要用到MFC,那把Support MFC打上勾,然后按完成.     新工程生成完毕后,在Class View里根结点按右键,选New Atl Object...,再选Simple Object,在short name里填上类名(起的类型不要和工程名重了),我填Blog,其他会自动填写完毕,OK     在Blo

(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令

原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上 一节说到如何弹出 IShellFolder 的上下文菜单,也就是 IContextMenu.有时候我们需要在这个菜单上面,加入一些属于自己的菜单项.举个例子,你打开资源管理器,查看左边目录树的

(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从"桌面"开始展开这里解释上一节中获取名称的方法 GetDisplayNameOf 定义: void GetDisplayNameOf(             IntPtr pidl,             SHGNO uFlags,             IntPtr lpName); 该方法是用来转

(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹  (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows 外壳编程.我们所看到的资源管理器以及整个桌面,都是一个 Shell. 关于 Windows 外壳的基本概念,我这里不做详细介绍,不了解的朋友,可以看看 姜伟华 的 Windows外壳名字空间的浏览. 好,现在让我们从基础学起,早日做出一个强大的资源管理器软件.(偶也是初学者,多多指教) 1 -

(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开

 原文   (C#)Windows Shell 编程系列2 - 解释,从"桌面"开始展开   (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 让我们详细解释一下 Shell 编程中最基本的一些函数.结构体和枚举. SHGetDesktopFolder  获取桌面的 IShellFolder 接口 [DllImport("shell32.dll")]