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;
            }
        }

Windows资源管理器上下文菜单单击功能不起作用

(简单(注册表设置是通过参数执行应用程序,就像在控制台中调用它一样:

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)

所以论点是

  1. string fileType-文件扩展名的HKC注册表项
  2. string shellKeyName-只是Explorer用来区分外壳扩展的注册表项名称
  3. string menuText-用户可以在资源管理器的上下文菜单中看到的内容
  4. 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>