Я создал приложение формы 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();
}
Попробуйте помещать кавычки вокруг имени приложения и имени файла:
string.Format("\"{0}\\GetCRC2.exe\" \"%1\"",appfilePath)
если файл назван "длинными волосами", args [1] будет "длинным", а args [2] будут "волосами",
Вы должны либо ввести имя файла в кавычки, либо сделать что-то, чтобы справиться со всеми пользовательскими вводами из командной строки, например, я не знаю...
для args.length следует добавлять args и пробел к переменной имени файла.
Извините, я не пишу фактический код, я едва знаю какой-либо С#