Я извиняюсь, если я повторяю свои объяснения повсюду, но я нахожу этот вопрос очень сложным, поэтому я постарался сделать так, чтобы он имел смысл для читателей:
Хотя может быть неизвестно, является ли это ошибкой или она была задумана, мы можем принудительно открыть ее в "том же" экземпляре, используя протокол динамического обмена данными (DDE), создав сообщение DDE вместо жесткого аргумента «% 1 "указывает на файл для этого экземпляра, чтобы открыть при выполнении файла. (Хотя DDE используется даже с жестким аргументом).
Сообщение DDE в этом случае используется для указания программе открыть файл. Для каждого исполняемого файла каждый раз создается новый экземпляр. Но когда используется протокол DDE, он сначала проверяет, был ли экземпляр уже создан, и если это так, он передает сообщение DDE первому найденному экземпляру и завершает работу, создавая тем самым иллюзию, что все файлы открываются в одном экземпляре, поскольку он мгновенный.
Спекуляции
Проблема открытия файлов в нескольких экземплярах, вероятно, связана с тем, сколько одного экземпляра уже загружено при вызове другого экземпляра. Тенденция между разницей во времени выполнения первого и второго экземпляров заключается в том, что с увеличением времени между выполнениями наблюдается тенденция к получению одного экземпляра, а при уменьшении - два экземпляра. Это говорит о том, что первый экземпляр должен быть загружен или "готов", чтобы открыть новый файл в этом же экземпляре, если выполняется другой файл, и если нет, он должен открыть файл сам с собой.
Кажется, когда путь к файлу используется в качестве аргумента для программы, он, кажется, следует этой тенденции только для:
При использовании в качестве аргумента для создания экземпляров за пределами первого экземпляра, если первый готов (или если первые не видят, что он готов), не первый экземпляр, кажется, может передать аргумент как сообщение DDE первому.
Однако, если мы выполняем программу и используем сообщение DDE, чтобы открыть файл, то, похоже, сразу следует протоколу DDE, готов ли первый экземпляр принять сообщение DDE через аргумент. Вероятность готовности первого экземпляра зависит от того, видит ли не первый первый экземпляр как готовый, а если нет, то не отправляет сообщение DDE первому, что, по-видимому, происходит только при открытии через аргумент. , Предположение о том, что не первый видит первое как "не готовое" или "несуществующее", подтверждается тем фактом, что сообщения DDE (из не первых) принимаются первым, когда: не первое не выполняется через конкатенация аргументов "% 1"; и сказано открыть через сообщение DDE.
Таким образом, мое предположение таково: код для этих приложений использует какой-то непонятный метод для определения того, "готов" ли другой экземпляр, и если это так, то будет использовать протокол DDE при использовании аргумента. Похоже, что для этого используется другой метод, а не только когда он получает протокол DDE для определения, отправлять ли его в другой экземпляр. Похоже, в действительности псевдокод был:
if(argrument.wasUsed()){
// Office's obscure condition
if(Office.thinksInstanceIsReady(anotherInstance)){
// Use DDE Protocol
if(anotherInstance.exists()){ // already knew that
sendDDEmessage(anotherInstance);
exitThisInstance();
}
} else {
selfFollowDDEmessage(); // Leave open this instance
}
if(givenDDEMessage()){
// Use DDE Protocol
if(anotherInstance.exists()){
sendDDEmessage(anotherInstance);
exitThisInstance();
} else {
selfFollowDDEmessage();
}
}
Невозможно сказать, является ли это ошибкой или она должна была быть неясной по какой-либо причине, без того, чтобы программисты не сообщили нам об этом.
Разрешение
Мы хотим настроить выполнение определенных расширений файлов так, чтобы они больше не отправляли путь файла ("% 1") исполняемого файла в качестве аргумента, а скорее указывали выполняемой программе выполнить содержимое сообщения DDE, о котором содержит запрос на открытие файла, который передаст его уже существующему экземпляру, если он существует, а если не использует его сам. Что, умозрительно, позволит обойти непонятные требования этих приложений для другого экземпляра, который будет рассматриваться как "готовый", если используется аргумент пути к файлу.
Это все расширения файлов, связанные с ключами класса, которые должны быть заменены на x
:
Для слова
FILEEXT CLASS NAME (x)
.doc* Word.Document.8
.docm† Word.DocumentMacroEnabled.12
.docx* Word.Document.12
.dot Word.Template.8
.dotm† Word.TemplateMacroEnabled.12
.dotx† Word.Template.12
.odt Word.OpenDocumentText.12
.rtf† Word.RTF.8
.wbk Word.Backup.8
.wiz Word.Wizard.8
.wll Word.Addin.8
Для Excel
FILEEXT CLASS NAME (x)
.csv* Excel.CSV
.ods Excel.OpenDocumentSpreadsheet.12
.slk Excel.SLK
.xla Excel.Addin
.xlam† Excel.AddInMacroEnabled
.xld Excel.Dialog
.xlk Excel.Backup
.xll Excel.XLL
.xlm Excel.Macrosheet
.xls* Excel.Sheet.8
.xlsb† Excel.SheetBinaryMacroEnabled.12
.xlshtml Excelhtmlfile
.xlsm† Excel.SheetMacroEnabled.12
.xlsx* Excel.Sheet.12
.xlt† Excel.Template.8
.xlthtml Excelhtmltemplate
.xltm† Excel.TemplateMacroEnabled
.xltx† Excel.Template
.xlw Excel.Workspace
.xlxml Excelxmlss
* Наиболее важные / распространенные расширения файлов, которые должны быть сделаны как минимум. Субъективная.
† Вторичные наиболее важные / общие расширения файлов, которые должны быть сделаны как минимум. Субъективная.
Эти списки можно реплицировать через командную строку: assoc | findstr Word
заменяет Word
на официальное сокращенное имя (с учетом регистра).
Все, что вы можете сделать, если считаете это необходимым. Если вы захотите сделать больше, возможно, вы захотите выполнить дополнительные шаги, которые я предоставлю, что должно сократить объем необходимой работы.
Вы должны следовать следующим инструкциям для каждого раздела реестра ниже, заменив x
на соответствующий класс (ы) по вашему выбору:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Например: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
)
Опять же, ключ OpenAsReadOnly
, необязательно , он будет готов, когда файл будет выполнен так, что он будет доступен только для чтения.
Небольшая предосторожность - бэкап
Чтобы лучше запомнить значения реестра перед изменением, вы можете щелкнуть правой кнопкой мыши на ключевой ветви HKEY_CLASSES_ROOT
и в контекстном меню нажать "Экспорт" и сохранить файл регистрации в определенном месте. В случае, если Док Браун говорит: "Нам нужно вернуться назад", вы можете просто импортировать раздел реестра, выполнив его и следуя инструкциям.
В качестве альтернативы, вы также можете запустить это, чтобы вы помнили, какие значения command
и имена классов были для исправления небольших ошибок:
assoc>>fileexts.txt
который можно отфильтровать, используя type fileexts.txt | findstr Word
ftype>>classnames.txt
который можно отфильтровать с помощью type classnames.txt | findstr Word
инструкции
Они должны соблюдаться для каждого значения ключа, указанного выше, как вы пожелаете.
Войдите в ваш любимый редактор реестра или regedit
и перейдите к классу, который вы хотите изменить.
Введите ключ с именем command
, щелкните правой кнопкой мыши значение (Default)
и выберите "Изменить" в контекстном меню.
В настоящее время установлено, что должно быть выполнено ftype | findstr Word
Измените его, чтобы удалить прямые аргументы в конце значения, включая пробел, чтобы они стали:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Для Excel 64-bit)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Для Word 64-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Для Word 32-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Для Excel 32-разрядная версия)
Введите ключ с именем ddeexec
(если он не существует, создайте ключ), который будет находиться рядом с command
ключом, щелкните правой кнопкой мыши значение (Default)
и нажмите "Изменить" в контекстном меню, и установите значение, чтобы стать :
[REM _DDE_Direct][FileOpen("%1")]
- (для Word)
[open("%1")]
- (для Excel)
Под ddeexec
создайте новый ключ с именем topic
(если он не существует), щелкните правой кнопкой мыши значение (Default)
и нажмите "Изменить" в контекстном меню и установите значение, чтобы стать system
(если его еще нет).
После внесения изменений вам, возможно, придется обновить shell32.dll, запустив его с повышенными правами командной строки или оболочки после создания этих изменений в реестре:
regsvr32 /i shell32.dll
Это было проверено на Windows 10 Office 2016 версии 16.0.8625.2127
Альтернативный ярлык
Вы также можете перейти к ключу для расширений файлов (например, HKEY_CLASSES_ROOT\.xlsx
) и изменить значение «(по умолчанию)» для отдельного класса, при таком подходе несколько расширений файлов могут указывать на одно и то же значение класса (например, как Excel.Sheet.12
), который вы должны изменить этот класс только один раз с сообщением DDE. Если вы сделаете это, следует также переименовать все повторения имени класса внутри этой ветви реестра. Однако этот способ не рекомендуется, так как он может легко сломаться, и его следует делать, если вы хотите использовать все расширения файлов, чтобы сэкономить время.
Sidenotes:
Аргумент /o
является аргументом для URL-адресов, поэтому не стоит беспокоиться о потере этой функциональности, поскольку она редко передается. Однако при желании вы можете попытаться оставить эту часть аргумента включенной при настройке значений (Default)
.
Я собираюсь сделать это вики-сообществом, так как оно очень умозрительно и еще не закончено (если Word и Excel были не единственными). Пожалуйста, прокомментируйте мнение по этому вопросу.