Прошу вибачення, якщо я повторюю свої пояснення протягом усієї дати, але я вважаю це питання дуже складним, тому я намагався переконатися, що це контекстуально має сенс для читачів:
Хоча може бути невідомо, чи це помилка чи вона призначена, ми можемо змусити її відкритись в "тому ж" екземплярі, використовуючи протокол динамічного обміну даними (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
:
Для Word
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"
(Для 64-розрядних програм Excel)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Для 64-розрядної програми Word)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Для 32-розрядної програми Word)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Для 32-розрядної програми Excel)
Введіть ключ, який називається ddeexec
(якщо його не існує, створіть ключ), який був би поруч із command
клавішею, клацніть правою кнопкою миші (Default)
значення та натисніть «Змінити» у контекстному меню та встановіть значення, яке стане таким:
[REM _DDE_Direct][FileOpen("%1")]
- (для слова)
[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. Якщо ви зробите це, вам слід також перейменувати всі повторення імені класу всередині цієї гілки реєстру. Однак цей спосіб не рекомендується, оскільки він може легко зламатися, і його слід робити, якщо ви зробите всі розширення файлів, щоб заощадити час.
Позначення:
/o
Аргумент є аргументом для URL - адрес, так що не є великою проблемою у втраті цієї функції , як це рідко передається. Однак, якщо ви цього хочете, ви можете спробувати залишити цю частину аргументу під час коригування (Default)
значень.
Я розглядаю можливість зробити цю вікі спільнотою, оскільки вона дуже спекулятивна, а також незавершена (якщо Word і Excel були не єдиними). Будь ласка, прокоментуйте думку з цього приводу.