Пробелы в filepath приводят к появлению нескольких экземпляров моего приложения при выполнении через контекстное меню Windows

1

Я создал приложение формы WPF, которое можно вызвать через контекстное меню Windows. Приложение отлично работает, когда я его отлаживаю. Когда я разворачиваю его и щелкаю правой кнопкой мыши по файлу, если он имеет пробелы в пути, он только читает путь до места, но открывает окно для каждого пробела в пути. Это очень раздражает, и я не уверен, как это исправить.

Я попытался использовать Environment.GetCommandLineArgs() в моем методе, а также просто использовать MainWindow (путь к файлам строк); оба метода создают одну и ту же проблему.

Это приложение ClickOnce, поэтому не уверен, что это связано с ним, но я фиксирую местоположение каталога исполняющей сборки, когда оно будет установлено в первый раз, и обновите реестр в оболочке HKEY_CLASSES_ROOT *\[ APP}\command. Значение по умолчанию - это расширенная строка с расположением исполняемого файла приложения ClickOnce, и я добавил "% 1", поэтому путь к файлу можно передать в качестве аргумента.

void checkRegistry()
{
    RegistryKey baseKey=Registry.ClassesRoot.CreateSubKey("*\\shell", RegistryKeyPermissionCheck.ReadWriteSubTree);

    //add the key
    RegistryKey menuKey=baseKey.CreateSubKey("GetCRC");
    menuKey.SetValue("", "Get CRC");

    //add the command key 
    RegistryKey commandKey = menuKey.CreateSubKey("command");
    string appfilePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    commandKey.SetValue("",String.Format("{0}\\GetCRC2.exe %1",appfilePath), RegistryValueKind.ExpandString);

    commandKey.Close();
    menuKey.Close();
    baseKey.Close();
}

public MainWindow(string filePath)
{
    InitializeComponent();

    //check registry and add menu option 
    checkRegistry();
    var args = Environment.GetCommandLineArgs();
    if (args.Count() > 1)
    {
        this.filepath = args[1];
    }
    else
    {
        //run the file signatures
        this.filepath = filePath;
    }
    textboxFilePath.Text = filepath;
    calcSignatures();
}

public MainWindow()
{
    InitializeComponent();
    //check registry and add menu option if it doesn't exist
    checkRegistry();
}
Теги:
wpf
command-line-arguments
contextmenu

2 ответа

1
Лучший ответ

Попробуйте помещать кавычки вокруг имени приложения и имени файла:

string.Format("\"{0}\\GetCRC2.exe\" \"%1\"",appfilePath)
  • 0
    Да, это добилось цели. Я чувствую себя ослом, если не осознаю этого сам. Спасибо, Атари.
0

если файл назван "длинными волосами", args [1] будет "длинным", а args [2] будут "волосами",

Вы должны либо ввести имя файла в кавычки, либо сделать что-то, чтобы справиться со всеми пользовательскими вводами из командной строки, например, я не знаю...

для args.length следует добавлять args и пробел к переменной имени файла.

Извините, я не пишу фактический код, я едва знаю какой-либо С#

Ещё вопросы

Сообщество Overcoder
Наверх
Меню