Windows资源管理器上下文菜单单击功能不起作用
本文关键字:功能 不起作用 单击 菜单 资源管理器 上下文 Windows | 更新日期: 2023-09-27 17:50:36
我想让用户只选择以下扩展文件:.jpg,.png, .tiff, .gif, .png
。使用Windows Explorer Context Menu
,我遵循以下链接:http://www.codeproject.com/Articles/15171/Simple-shell-context-menu?msg=4779433#xx4779433xx我可以成功地注册和取消注册.jpg文件。
当我点击命令fileCopytoDirA
时,没有发生任何事情,即功能不工作。(我使用控制台应用程序的方法与我的功能相同,它起作用(。
其中&在单击"fileCopytoDirA
"期间,我应该如何调用该函数??有什么帮助吗?
[在此输入图像描述][1]
要在注册表中注册的代码:
InitializeComponent();
string menuCommand = string.Format("'"{0}'" '"%L'"", Application.Current);
FileShellExtension.Register("OISjpegfile", "fileCopytoDirA", "fileCopytoDirA", menuCommand);
点击时要执行的功能:
static void fileCopytoDirA(string filePath)
{
try
{
File.Copy(filePath, System.IO.Path.Combine(@"C:'Test'Directories'", System.IO.Path.GetFileName(filePath)), true);
}
catch (Exception ex)
{
MessageBox.Show(string.Format("An error occurred: {0}", ex.Message));
return;
}
}
Function to un register the registry entries during WPF application close:
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
FileShellExtension.Unregister("OISjpegfile", "fileCopytoDirA");
}
[1]: https://i.stack.imgur.com/eAN5F.png
Metadings
回答后编辑:
App()
{
InitializeComponent();
string menuCommand = string.Format("'"{0}'" '"%L'"", System.Reflection.Assembly.GetExecutingAssembly().Location);
FileShellExtension.Register("OISjpegfile", "fileCopytoDirA", "fileCopytoDirA", menuCommand);
}
[STAThread]
public static void Main(string args)
{
if (string.IsNullOrEmpty(args))
{
// Run your Main Form
// (blocks until Form1 is closed)
Window3 window = new Window3();
App app = new App();
app.Run(window);
}
else
{
// Run the context menu action
fileCopytoDirA(args);
}
// exit
}
static void fileCopytoDirA(string args)
{
try
{
File.Copy(args, System.IO.Path.Combine(@"C:'Test'Directories'", System.IO.Path.GetFileName(args)), true);
}
catch (Exception ex)
{
MessageBox.Show(string.Format("An error occurred: {0}", ex.Message));
return;
}
}
(简单(注册表设置是通过参数执行应用程序,就像在控制台中调用它一样:
app.exe "TheJpegFile.jpg"
所以入口点是static void Main(string args)
,从那里可以调用fileCopytoDirA(args)
。资源管理器调用函数的名称并没有什么神奇的方法。你可以像这个项目那样实现COM接口,也可以通过重定向Main来快速而肮脏地实现;如果没有参数,运行(windows窗体(应用程序-如果有参数,执行操作并退出:
using System;
using System.Windows.Forms;
public static class Program {
public static void Main(string args) {
if (string.IsNullOrEmpty(args)) {
// Run your Main Form
// (blocks until Form1 is closed)
Application.Run(new Form1());
}
else {
// Run the context menu action
fileCopytoDirA(args);
}
// exit
}
}
FileShellExtension。寄存器功能定义为
public static void Register(string fileType,
string shellKeyName, string menuText, string menuCommand)
所以论点是
string fileType
-文件扩展名的HKC注册表项string shellKeyName
-只是Explorer用来区分外壳扩展的注册表项名称string menuText
-用户可以在资源管理器的上下文菜单中看到的内容string menuCommand
-shell命令Explorer的执行方式与在控制台或通过链接执行的方式相同
第页。S: 在WPF中,它是类似的,但您创建了新的YourApp类(派生自System.Windows.Application(,然后调用Run。
假设Application.xaml看起来像
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
</Application>
您的应用程序类位于名为App
的名称空间WpfApplication1
中,并且您有一个Window1.xaml,q'n'd看起来像
namespace WpfApplication1
{
public partial class App : Application
{
App()
{
InitializeComponent();
}
[STAThread]
static void Main(string args)
{
if (string.IsNullOrEmpty(args)) {
// Run your Main Form
// (blocks until Form1 is closed)
Window1 window = new Window1();
App app = new App();
app.Run(window);
}
else {
// Run the context menu action
fileCopytoDirA(args);
}
// exit
}
static void fileCopytoDirA(string args) {
// this your part ;)
}
}
}
Btw。我从这个源代码中获取了WPF Main部分,从Application.xaml中删除StartupURI="Window1.xaml"
属性似乎很重要,因为它现在看起来像
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>