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

简介: 原文(C#)Windows Shell 外壳编程系列6 - 执行 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)接上一节:(C#)Windows Shell 外壳编程系列5 - 获取图标 执行    许多人都知道 ShellExecute ,用于执行一个外部命令。

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

 

目录
相关文章
|
2月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
2月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
15天前
|
JavaScript 前端开发 Shell
Shell 脚本编程保姆级教程(上)
Shell 脚本编程保姆级教程(上)
|
29天前
|
存储 C# 开发者
C# 编程基础:注释、变量、常量、数据类型和自定义类型
C# 编程基础:注释、变量、常量、数据类型和自定义类型
22 1
|
15天前
|
Shell
Shell 脚本编程保姆级教程(下)
Shell 脚本编程保姆级教程(下)
|
24天前
|
存储 Unix Shell
Shell编程基础与实用技巧
Shell编程基础与实用技巧
|
29天前
|
机器学习/深度学习 Unix Java
技术笔记:Linux之Shell脚本编程(一)
技术笔记:Linux之Shell脚本编程(一)
30 0
|
1月前
|
Shell Perl
7操作系统基础-Shell编程
7操作系统基础-Shell编程
13 0
|
2月前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
2月前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)