Ele*_*ios 10 .net c# vb.net windows com
我在白天管理和组织了许多文件,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++编写的例子(我认为之前是相同的源代码),我完全不理解,我不确定这是否有帮助我,因为我重申,取代SendTo不是我的想法(仅仅因为我不知道如何正确地做到这一点,避免所有可能的风险,我更喜欢仍然让Windows逻辑复制/发送文件,我只想检测复制操作以检索信息)
步骤1:
选择一个随机文件并使用SendTo菜单(用我的语言,西班牙语,命令名称为' Enviar a ')

第2步:
让.net应用程序的逻辑(在后台工作)拦截SendTo操作以检索信息.
(我只需要帮助这一步)
第3步:
在屏幕上的某处显示信息以确保执行SendTo操作,以确保我正确地单击了SendTo项目(My Link).

(那个弹出窗口只是一个模拟,我不知道有什么方法可以检索所有这些信息)
一旦你理解了SendTo的真正功能,它就变得非常简单了,它根本不涉及COM或shell扩展.基本上,发送到菜单中填充了用户配置文件的SendTo文件夹的内容(在Windows 6.x中默认为C:\ Users \\ AppData\Roaming\Microsoft\Windows\SendTo).
单击时,如果该选项是文件夹的快捷方式,它将复制文件,但如果有程序的快捷方式(或程序可执行文件本身),它将运行该程序,将所选文件的路径作为命令传递-line参数.
从那里开始,制作一些简单地将路径作为参数,提供某种通知然后复制文件或用它们做任何你想做的事情都是微不足道的.
一个快速而肮脏的例子可能如下(在C#中,但可以用其他任何东西完成):
private static void Main(string[] args)
{
if(MessageBox.Show("Are you sure you want to copy files?", "Copy files", MessageBoxButtons.YesNo) == DialogResult.No) return;
foreach (string file in args)
File.Copy(file, Path.Combine("c:\\temp", Path.GetFileName(file));
}
Run Code Online (Sandbox Code Playgroud)
这只是要求确认复制一堆文件.请注意,这实际上不会"拦截"发送到菜单,而是完全处理它,因此程序负责执行任何有意义的操作.更严肃的实现可以使用内置的Windows复制对话框并显示一些屏幕上的进度或其他任何内容,这些都符合您的需求.
它还可以在命令行上使用更多参数.在SendTo文件夹中放置快捷方式时,目标可以添加一些将作为第一个参数传递的参数(在文件名之前).例如,快捷方式的目标可以读取c:\program files\copyfiles.exe c:\temp以传递目标文件夹而不是硬编码.然后,被调用程序必须将第一个参数解释为目标路径,将后续参数解释为源文件.
也许我来回答我自己的问题有点晚了,这个问题是在 2015 年发布的,但直到几天前我才再次对这个问题产生了兴趣,在 .NET 之后获得了更多的经验和知识。这些年我从头开始,尝试去理解过去不理解的一切。
\n我刚刚发现,正如 @\xc5\x87\xc9\x8fssa P\xc3\xb8ngj\xc7\xa3rdenlarp 已经在评论框中评论的那样,显然完成此操作的最可行方法是实现我自己的 SendTo 上下文菜单并使用IFileOperationProgressSink接口来报告进度,为此我首先需要依赖于IFileOperation接口的使用。
\n使用IFileOperation接口的原因是,它似乎是 Windows API 中提供的唯一方法,可以让开发人员在同一进度对话框 UI 中同时执行多个文件操作(复制、移动、重命名、创建或删除)。这可能是当用户选择多个文件或目录(通过SendTo菜单或仅使用CTRL+C和CTRL+V)来一次移动或复制它们时系统使用的界面,因为它只显示一个进度对话框,其中包含所有复制操作在其中排队...
\n\n显然IFileOperation和IFileOperationProgressSink接口正是我所需要的。但据我所知,.NET 框架命名空间中没有这些接口的托管实现(Microsoft 的 WindowsAPICodePack 库中也没有),考虑到这些接口自 Windows VISTA 时代甚至这是一个无可争议的改进,与您可以想到的用于执行复制、移动、重命名、创建或删除操作的任何内置成员(例如System.IO.File.Copy或Microsoft.VisualBasic )完全相反.FileIO.FileSystem.CopyFile方法。所有这些都仅支持单个操作,并且一次仅支持单个进度对话框。
\n因此,我专注于研究建议的解决方案,最终在此存储库中找到了IFileOperation和IFileOperationProgressSink接口的良好实现:
\n\n这是我在 Microsoft 的一篇旧文章中找到的原始实现,该文章还附带了一个很好的 PDF 阅读来学习一些东西:
\n\n实际上,对于我自 2015 年以来在此线程中讨论的内容,没有必要深入研究使用IFileOperationProgressSink接口来报告进度(仅当我确实想要深入的进度信息时),因为它足以确定复制已开始/已执行对IFileOperation.PerformOperations函数的调用,如果复制过程中出现任何问题,则会出现在进度对话框 UI 中。
\n但当然,仍然需要开发一个自定义 SendTo 菜单的外壳扩展,以取代 Windows 中内置的菜单。可以使用SharpShell库开发 Shell 扩展。
\n我用VB.NET语言进行开发。我设法扩展并记录了他们的IFileOperation实现和包装器,并更新了枚举,添加了为 Windows 7 和 Windows 8 添加的更新的缺失值。
\n如果它对某人有帮助,我将在新答案中附加IFIleOperation和 Vb.NET 中的包装器(因为它超出了帖子允许的最大字符限制)。
\n请注意,在我的IFileOperation接口和名为FileSystemOperation的包装类的实现中,您会发现一些返回类型和缺少的类或方法(例如 HRESULT 返回类型或 NativeMethods 类),我只是无法在一处共享所有内容,但是这些缺少的东西是任何有经验的程序员都知道如何解决的东西(例如,将 HRESULT 更改为 UInteger 类型,然后转到 Pinvoke.net 从我的 NativeMethods 类中查找任何缺少的方法)。
\n看来 StackOverflow 不允许我添加另一个答案,所以我将在 PasteBin 上上传我的实现:
\nClass FileSystemOperation\nhttps://pastebin.com/nvgLWEXu\n\nInterface IFileOperation\nhttps://pastebin.com/GzammHtu\n\nInterface IFileOperationProgressSink\nhttps://pastebin.com/jf9JjzyH\n\nClass ComObjectDisposer(Of T As Class)\nhttps://pastebin.com/7mPeawWr\n\nEnum TransferSourceFlags\nhttps://pastebin.com/V7wSSEvv\n\nEnum FileOperationFlags\nhttps://pastebin.com/A223w9XY\nRun Code Online (Sandbox Code Playgroud)\n就这样。
\n| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |