我正在寻找一个shell扩展,所以当一个文件被点击时,可以执行一个动作。 (像任何其他上下文菜单:))
我需要在上下文菜单中插入一个新的菜单项,并对一个或多个文件执行一个操作。 一个比较例子是我select了10个文件和发送到邮编。
我读过写一些非托pipe代码是必需的,但我对c ++非托pipe代码的知识大约为零,所以我想尽可能less地获取Windows上下文菜单(文件>右键单击)中的菜单项。 之后,我想调用一个C#控制台应用程序来做主要处理,所以有可能从非托pipe代码调用ac#控制台应用程序?
此外,什么types的视觉工作室项目,我需要创buildWindows Shell程序? 我可以select哪种types的项目:
干杯
这MSDN文章将让你开始。
你产生一个进程(用托管代码编写)做外壳扩展的实际工作的方法应该没问题。 我建议只是通过CreateProcess作为命令行参数传递选定的文件。
至于项目类型,您将需要生成一个Win32动态链接库(DLL)。 在2005年,实际上有一个Win32 Dll项目类型。 2008年(我推断你正在使用),你应该创建一个Win32项目,然后选择DLL作为应用程序类型在生成的向导。
尽管在托管代码中完全编写一个shell扩展并不是不可能(我已经完成了),但是由于各种各样的原因,我们不建议这样做,但最大的一点是shell扩展是进程内扩展,这意味着explorer必须加载整个CLR放到它自己的地址空间中,如果你有两个扩展写到不同版本的CLR上,上帝会帮助你。
最重要的是,这样一个小功能的开销很大。 所以最好用C ++编写,因为有很多工具可以做到这一点,包括活动模板库(ATL)。
如果你没有Windows和COM的C ++经验,那么shell扩展可能不是最容易实现的项目。
你确定你确实需要编写一个shell扩展吗?
您可以通过注册表轻松地添加一个新的菜单选项( 例如 ),并将该选项的“命令”设置为您的C#可执行文件。
编辑:您可以通过在路径中使用%1命令将选定的文件传递给进程。
所有文件的示例注册表项将是:
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ * \ shell \ SomeCmd] @ =“做一些命令”
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ * \ shell \ SomeCmd \ command] @ =“应用程序路径\ YourApp.exe”%1“
注意最后的“%1” – 它将是文件的名称。 限制是,你将实际上每个文件实例化一次 – 这也将发生在一个扩展。 一旦注册表项设置,它将在那里,直到你删除它。
以下是如何在.NET中使用非托管客户端的一个示例: http : //groups.google.com/group/codefactory/web/wcf-service-and-unmanaged-c-client
是的,您将不得不编写非托管代码(C ++)来与Shell进行交互。 一些外壳扩展是用C#编写的,但是即使是微软也不推荐它,因为它在浏览器的进程空间中加载运行时。 在编写ContextMenu扩展时,您可以在codeproject上找到很多文章。 它涉及到编写一个实现IContextMenu接口的COM DLL,并在注册表中正确注册它。