设想

我白天管理和整理许多文件, SendTo 是我在Windows上最常用的功能。

问题

默认情况下,当用户单击上下文菜单的项目/链接发送文件时, O.S 不会显示任何类型的建议/通知,表明文件正在复制到选定的目标。

我认为这是一个非常错误的设计问题,因为对于大文件,它可以...显示进度条,但是如果文件太小,则不会显示任何进度条/可视指示器,因此无法确保复制文件(无需人工操作),因为我是人类,因此我可以在 SendTo 上下文菜单之外单击,但会出现错误。

因此,我想开发一个个人迷你工具,当我使用contextmenu菜单中的 SendTo 功能(仅 SendTo)发送/复制文件时,可以帮助我优化在屏幕上显示通知窗口的时间。 功能。

问题

简而言之,我想通过提供其他基本信息(例如源文件夹)从 SendTo 菜单中检测复制/发送操作,以确保在菜单项上(而不是在菜单外)正确完成了单击,目标文件夹以及文件或文件路径的数量。

有什么想法开始朝正确的方向开发此工具吗?

我将感谢 C# VB.Net 中的代码示例,最好是最后一个。

方法

由于我不知道如何开始执行此操作,我的意思是这可能是拦截这些 SendTo 调用的最简单或有效的方法,因此我首先想钩住 CopyFile CopyFileEx API函数,但它们没有提供所需的信息,因为该函数将在任何类型的复制操作中调用,而不仅是在我使用 SendTo 功能时,所以我迷路了。

我不确定是否应该对内部调用进行更多调查,或者对Windows contextmenu本身进行更多调查,而不是弄乱函数挂钩和我可以避免的丑陋事情。

我的主要想法是开发一个隐藏的WinForms(或Windows服务),当我使用 SendTo 功能(当我单击 SendTo 菜单中的某个项目时)时,它处于后台等待状态。屏幕上的可视指示器,以确保我正确单击了该菜单项,并可能会告知我要移动的文件数量以及它们的移动位置。

研究

这是一个代码示例,我认为它演示了如何实例化 SendTo com对象以创建自己的com对象,但是它是用c++编写的,我不确定该示例是否有用,因为我的意图不是替换 SendTo 菜单,但是我将在这里保留此有用信息,它还可以用于其他用途:

How to add(enable) standard "Send To" context menu option in a namespace extension

KNOWNFOLDERID 常量文档提供了有关 SendTo 文件夹的一些有用信息,我不确定这是否可能对读/访问监视方法有所帮助?,我将信息保留在此处:



Shell Extension Handlers 文档中,有一个 Copy hook handler ,我不知道它是否与 SendTo COM 组件有关,如果可以以某种方式对我有所帮助,
IContextMenu::InvokeCommand 方法引用有同样的无知,也许我可以拦截它以标识 SendTo 调用?

此刻,我感觉自己像瞎子一样飞。

我最近发现了这个 A managed "Send To" menu class ,但是我再次完全不了解它是一个用C/C++编写的示例(我认为以前是同一来源),我不确定这是否可以帮到我,因为我重复了替换 SendTo 不是我想要的(只是因为我不知道如何正确地执行此操作以避免所有可能的风险,我还是希望让Windows逻辑复制/发送文件,我只想检测复制操作检索信息)

预期结果和用途

步骤1:

选择一个随机文件,然后使用 SendTo 菜单(以我的语言,西类牙语,命令名称为“ Enviar a ”)

步骤2:

让.net应用程序的逻辑(在后台工作)拦截 SendTo 操作以检索信息。

(我仅需要此步骤的帮助)

步骤3:

在屏幕上的某处显示信息,以确保执行了 SendTo 操作,以确保我正确单击了 SendTo 项目(我的链接)。

(该弹出窗口只是一个模拟,我不知道任何方式来检索所有这些信息)

最佳答案

一旦了解了SendTo的实际功能,这真的很简单,而且根本不涉及COM或Shell扩展。基本上,“发送到”菜单填充有用户配置文件的SendTo文件夹的内容(在Windows 6.x中默认为C:\Users\\AppData\Roaming\Microsoft\Windows\SendTo)。

单击该选项时,如果该选项是文件夹的快捷方式,它将在其中复制文件,但是如果有程序(或程序可执行文件本身)的快捷方式,它将运行该程序,并将所选文件的路径作为命令传递行参数。

从那里开始,制作一些简单的程序,简单地将路径作为参数,给出某种通知,然后复制文件或对它们执行任何操作,这确实很简单。

一个快速而肮脏的示例如下(在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));
}

这只是要求复制一堆文件的确认。请注意,这实际上不是“拦截”发送到菜单,而是完全处理它,因此程序负责执行任何有意义的操作。更认真的实现可以使用the built-in Windows copy dialog并显示一些带有进度或其他任何内容的屏幕,这取决于您的需求。

它也可以在命令行上使用更多参数。当您在SendTo文件夹中放置快捷方式时,目标位置可能会添加一些其他参数,这些参数将作为第一个参数传递(在文件名之前)。例如,快捷方式的目标可以读取c:\program files\copyfiles.exe c:\temp来传递目标文件夹,而不是硬编码。然后,被调用程序必须将第一个参数解释为目标路径,而将随后的参数解释为源文件。

关于c# - 拦截MS Windows的 'SendTo'菜单调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29546537/

10-11 19:29