在Windows(资源管理器)中单击粘贴时执行应用程序
本文关键字:执行 应用程序 单击 Windows 资源管理器 | 更新日期: 2023-09-27 17:59:16
我有一个应用程序,它基本上是一台复印机,但它可以做更多的其他事情。我无法通过的是:
当用户选择了一些文件(在资源管理器、桌面或Windows中的任何位置)时,我想打开应用程序,并且所有这些选择的文件都应该在缓存或类似的文件中,以便它在列表或其他文件中。
这是由Windows完成的,所以我不必这么做。当用户选择了他想要选择的所有文件并将其复制时,当用户将这些文件粘贴到其他地方时,我该如何执行应用程序?所以它会自动打开?
我有这个:
[DllImport("User32.dll")]
protected static extern int
SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool
ChangeClipboardChain(IntPtr hWndRemove,
IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg,
IntPtr wParam,
IntPtr lParam);
IntPtr nextClipboardViewer;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// Defined in winuser.h
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
{
nextClipboardViewer = m.LParam;
}
else
{
SendMessage(nextClipboardViewer, m.Msg, m.WParam,
m.LParam);
}
break;
default:
base.WndProc(ref m);
break;
}
}
void DisplayClipboardData()
{
try
{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Rtf))
{
richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);
}
else if (iData.GetDataPresent(DataFormats.Text))
{
richTextBox1.Text = (string)iData.GetData(DataFormats.Text);
}
else
{
richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
但这仅在选择文本时有效。如何显示每个文件的文件目录?
如果您想对复制(Ctrl+C)或剪切(Ctrl+V)操作而不是粘贴(Ctrl+V
你所要做的就是监视剪贴板,因为这就是这些信息的去向。您必须侦听的数据格式是FileDrop
。
不幸的是,您将不得不使用WinAPI来侦听剪贴板的更改。
当你收到这样的更改时,你可以检索复制文件的列表,如下所示:
void DisplayClipboardData()
{
if(!Clipboard.ContainsFileDropList())
return;
var fileList = Clipboard.GetFileDropList();
// Do something with the file list.
}
我认为你必须做两件事:
1) 连接到windows键盘&使用SetWindowsHookEx的鼠标事件,下面是winform应用程序中的一个示例
2) 检查剪贴板的内容并用它们做你需要的事情
这种方法的主要作用是,监听键盘事件的钩子必须与线程相关联,因此您的应用程序必须已经加载并保持在内存中,以便接收事件。你可以创建一个有限的gui,并在系统中有一个图标。
编辑:MSDN关于windows挂钩的概述