这似乎是一个常见的问题,但经过一些搜索后,我真的无法找到答案.这里有一篇文章:
http://www.codeproject.com/KB/shell/shellextguide1.aspx
但它适用于Visual Studio的旧版本.我正在使用VS 2008,所以说明和界面似乎与我所看到的不相符.
我想使用C++创建一个简单的shell扩展,为扩展名为.GZ的文件创建上下文菜单.当右键单击这些文件时,我应该能够单击我的上下文菜单项并在代码中进行回调以对该文件执行某种操作.
其他上下文菜单项将执行诸如生成无模式对话框之类的操作,以在执行某些操作之前接受用户输入.
从我所看到的,ATL用于此,但我从未使用过ATL,所以所有的对象类型和接口都让我很困惑.如果我有适当的教程或文档可供阅读,那就不会那么糟糕了.
谁能帮我吗?是不是有一些不是10年的教程?
我在白天管理和组织了许多文件,SendTo是我在Windows上使用最常用的功能.
默认情况下,当用户单击上下文菜单的项目/链接以发送文件时,操作系统不会显示任何类型的通知/通知程序,指示文件正在复制到所选目标.
我认为这是一个非常错误的设计问题,因为对于大文件,它可以......显示进度条,但如果文件很小,它将不会显示任何进度条/可视指示器,因此无法确保文件被复制(没有手动操作)因为我是人类,我可以通过错误点击SendTo上下文菜单外部.
因此,我想开发一个个人迷你工具,当我使用上下文菜单中的SendTo功能发送/复制文件时,只有SendTo功能,这将帮助我优化我的时间向我显示通知窗口.
简单来说,我想从SendTo菜单中检测复制/发送操作,以确保点击在菜单项上正确完成(而不是在菜单外),同时提供其他基本信息,如源文件夹,目标文件夹,以及文件或文件路径的数量.
是否有任何想法开始朝着正确的方向开发这个工具?
我将非常感谢C#或VB.Net中的代码示例,最好是最后一个.
由于我不知道如何开始这样做,我的意思是哪种拦截SendTo调用是最容易或最有效的方式,首先我想挂钩CopyFile或CopyFileEx API函数,但它们不提供我需要的信息因为该函数将在任何类型的复制操作中调用,而不仅仅是在我使用SendTo功能时,所以我迷路了.
我不确定我是否应该调查更多有关内部调用的内容,或者可能会更多地调查windows contextmenu本身,而不是弄乱我可以避免的函数钩子和丑陋的东西.
我的主要想法是开发一个隐藏的WinForms(或者是一个Windows服务),当我使用SendTo功能时(当我点击SendTo菜单的一个项目时)在后台等待,然后显示任何类型的可视指示器.屏幕,以确保我正确地点击该菜单项,并可能告知我正在移动的文件数量以及我正在移动它们的位置.
这是一个代码示例,我认为它演示了如何实例化SendTo com对象来创建自己的?,但是它是用c ++编写的,我不确定该示例是否有用,因为我的目的不是替换SendTo菜单而是我会在这里保留这个有用的信息它为其他东西提供服务:
如何在命名空间扩展中添加(启用)标准"发送到"上下文菜单选项
该KNOWNFOLDERID常数文档提供了有关一些有用的信息的SendTo文件夹中,我再次不知道这也许可以帮助读/访问监测方法?我只是不停的信息在这里:
GUID:{8983036C-27C0-404B-8F08-102D10DCFD74}
默认路径:%APPDATA%\ Microsoft\Windows\SendTo
旧版默认路径:%USERPROFILE%\ SendTo
在Shell扩展处理程序文档中有一个Copy钩子处理程序,我不知道它是否与SendTo的COM组件有关系,如果这可以在某种程度上帮助我,对IContextMenu :: InvokeCommand方法引用同样无知也许我可以拦截它来识别SendTo调用?
到目前为止我觉得自己是盲目的.
我最近发现这是一个托管的"发送到"菜单类,但它又是一个用C/C++编写的例子(我认为之前是相同的源代码),我完全不理解,我不确定这是否有帮助我,因为我重申,取代 …
是否可以从我的C#应用程序获取当前在Windows资源管理器中选择的文件列表?
我已经对从C#等托管语言与Windows资源管理器交互的不同方法做了大量研究.最初,我正在研究shell扩展的实现(这里和这里例如),但显然这是托管代码中的一个坏主意,并且对我的情况来说可能有点过分.
接下来,我查看了PInvoke/COM解决方案,并发现了这篇文章,它让我得到了这段代码:
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
string filename;
ArrayList windows = new ArrayList();
foreach(SHDocVw.InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
if(filename.Equals("explorer"))
{
Console.WriteLine("Hard Drive: {0}", ie.LocationURL);
windows.Add(ie);
var shell = new Shell32.Shell();
foreach (SHDocVw.InternetExplorerMedium sw in shell.Windows())
{
Console.WriteLine(sw.LocationURL);
}
}
}
Run Code Online (Sandbox Code Playgroud)
...但是单个InternetExplorer对象没有获取当前文件选择的方法,尽管它们可用于获取有关窗口的信息.
然后我发现这篇文章正是我所需要的,但是在C++中.以此为出发点,我试图通过shell32.dll在项目中添加作为参考来进行一些翻译.我最终得到了以下内容:
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
string filename;
ArrayList windows = new ArrayList();
foreach(SHDocVw.InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
if(filename.Equals("explorer")) …Run Code Online (Sandbox Code Playgroud) 有没有比这更简单的方法在.NET中创建shell扩展?
http://www.theserverside.net/tt/articles/showarticle.tss?id=ShellExtensions
这篇文章的日期是2004年.