Ich entschuldige mich, wenn ich meine Erklärungen durchgehend wiederhole, aber ich finde dieses Problem sehr komplex und habe versucht, sicherzustellen, dass es für die Leser kontextuell sinnvoll ist:
Obwohl möglicherweise nicht bekannt ist, ob dies ein Fehler ist oder beabsichtigt war, können wir erzwingen, dass er in derselben Instanz geöffnet wird, indem das DDE (Dynamic Data Exchange Protocol) verwendet wird, indem anstelle des harten Arguments "%" eine DDE-Nachricht erstellt wird 1 "zeigt auf die Datei, die diese Instanz beim Ausführen der Datei öffnen soll. (Obwohl DDE auch mit dem harten Argument verwendet wird).
In diesem Fall wird die DDE-Nachricht verwendet, um das Programm anzuweisen, eine Datei zu öffnen. Für jede ausgeführte Datei wird jedes Mal eine neue Instanz erstellt. Wenn das DDE-Protokoll verwendet wird, wird zunächst geprüft, ob eine Instanz bereits erstellt wurde. In diesem Fall wird die DDE-Nachricht an die zuerst gefundene Instanz weitergeleitet und beendet, wodurch die Illusion entsteht, dass alle Dateien in einer einzelnen Instanz geöffnet werden, da sie sofort vorliegen.
Spekulationen
Das Problem, dass die Dateien in mehreren Instanzen geöffnet werden, hängt wahrscheinlich damit zusammen, wie viel eine einzelne Instanz bereits geladen hat, wenn eine andere Instanz aufgerufen wird. Der Trend zwischen der Ausführungszeitdifferenz einer ersten und einer zweiten Instanz besteht darin, dass mit zunehmender Zeit zwischen den Ausführungen tendenziell eine einzelne Instanz und mit abnehmender Zeit zwei Instanzen erzielt werden. Dies legt nahe, dass die erste Instanz geladen oder "bereit" sein muss, um eine neue Datei in derselben Instanz zu öffnen, wenn eine andere Datei ausgeführt wird, und wenn dies nicht der Fall ist, muss die Datei mit sich selbst geöffnet werden.
Wenn der Dateipfad als Argument für das Programm verwendet wird, scheint er diesem Trend nur zu folgen:
Bei Verwendung als Argument zum Erstellen von Instanzen über die erste Instanz hinaus, wenn die erste bereit ist (oder wenn Nicht-Erste sehen, dass dies bereit ist), scheint die Nicht-Erste-Instanz in der Lage zu sein, das Argument als DDE-Nachricht an die erste weiterzuleiten.
Wenn wir jedoch das Programm ausführen und eine DDE-Nachricht zum Öffnen der Datei verwenden, scheint es dem DDE-Protokoll sofort zu folgen, ob die erste Instanz bereit ist, die DDE-Nachricht über ein Argument zu akzeptieren oder nicht. Ob die erste Instanz wahrscheinlich bereit ist oder nicht, hängt davon ab, ob der Nicht-Erste die erste Instanz als bereit ansieht, und wenn dies nicht der Fall ist, wird die DDE-Nachricht nicht an die erste gesendet, was anscheinend nur auftritt, wenn sie über ein Argument geöffnet wird . Die Spekulation, dass der Nicht-Erste den Ersten als nicht "bereit" oder "nicht existent" ansieht, wird durch die Tatsache nahegelegt, dass DDE-Nachrichten (von Nicht-Ersten) vom Ersten akzeptiert werden, wenn: der Nicht-Erste nicht über ausgeführt wird eine Argumentverkettung "% 1"; und es wird angewiesen, über eine DDE-Nachricht zu öffnen.
Als solches ist meine Spekulation: Der Code für diese Anwendungen verwendet eine obskure Methode, um zu bestimmen, ob eine andere Instanz "bereit" ist, und wenn ja, würde er das DDE-Protokoll verwenden, wenn ein Argument verwendet wird. Dies scheint eine andere Methode zu verwenden als nur, wenn das DDE-Protokoll empfangen wird, um zu bestimmen, ob es an eine andere Instanz gesendet werden soll. Es scheint tatsächlich, dass der Pseudocode war:
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();
}
}
Es gibt keine Möglichkeit zu sagen, ob dies ein Fehler ist oder aus einem bestimmten Grund dunkel sein sollte, ohne dass die Programmierer uns darüber informieren.
Die Auflösung
Wir möchten die Ausführung bestimmter Dateierweiterungen so anpassen, dass der Dateipfad ("% 1") der ausgeführten Datei nicht mehr als Argument gesendet wird, sondern das ausgeführte Programm angewiesen wird, den Inhalt der DDE-Nachricht auszuführen enthält eine Anforderung zum Öffnen einer Datei, die sie an eine bereits vorhandene Instanz weiterleitet, falls vorhanden, und wenn sie nicht selbst verwendet wird. Was spekulativ die obskuren Anforderungen dieser Anwendungen umgeht, damit eine andere Instanz als "bereit" angesehen wird, wenn ein Argument für den Dateipfad verwendet wird.
Dies sind alles Dateierweiterungen, die mit Klassenschlüsseln korreliert sind und durch Folgendes ersetzt werden sollen x
:
Für 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
Für 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
* Die wichtigsten / häufigsten Dateierweiterungen, die mindestens durchgeführt werden sollten. Subjektiv.
† Sekundär wichtigste / häufigste Dateierweiterungen, die mindestens durchgeführt werden sollten. Subjektiv.
Diese Listen können über die Befehlszeile repliziert werden: assoc | findstr Word
Ersetzen Word
durch den offiziellen verkürzten Namen (Groß- und Kleinschreibung beachten).
All dies haben Sie die Möglichkeit zu tun, wenn Sie dies für notwendig halten. Wenn Sie mehr tun möchten, möchten Sie möglicherweise die optionalen Schritte befolgen, die ich bereitstellen werde, um den Arbeitsaufwand zu verringern.
Sie müssen die folgenden Anweisungen für jeden Registrierungsschlüssel befolgen, indem Sie den x
durch die entsprechenden Klassen Ihrer Wahl ersetzen :
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Ex: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
)
Auch hier ist der OpenAsReadOnly
Schlüssel optional. Dieser ist bereit, wenn die Datei so ausgeführt wird, dass sie schreibgeschützt ist.
Eine kleine Vorsichtsmaßnahme - ein Backup
Um sich am besten an die Registrierungswerte vor der Änderung zu erinnern, klicken Sie mit der rechten Maustaste auf den Schlüsselzweig HKEY_CLASSES_ROOT
, klicken Sie im Kontextmenü auf "Exportieren" und speichern Sie die Registrierungsdatei an einem Speicherort. Falls Doc Brown sagt "Wir müssen zurück", können Sie den Registrierungsschlüssel einfach importieren, indem Sie ihn ausführen und den Anweisungen folgen.
Alternativ können Sie dies auch ausführen, damit Sie sich daran erinnern, mit welchen command
Werten und Klassennamen kleine Fehler behoben wurden:
assoc>>fileexts.txt
die mit gefiltert werden kann type fileexts.txt | findstr Word
ftype>>classnames.txt
die mit gefiltert werden kann type classnames.txt | findstr Word
Anleitung
Diese müssen für jeden oben aufgeführten Schlüsselwert befolgt werden, wie Sie es wünschen.
Rufen Sie Ihren bevorzugten Registrierungseditor auf oder regedit
gehen Sie zu der Klasse, die Sie ändern möchten.
Geben Sie den Schlüssel ein command
, klicken Sie mit der rechten Maustaste auf den (Default)
Wert und klicken Sie im Kontextmenü auf "Ändern".
Derzeit sollte festgelegt werden, was von ausgeführt wurde ftype | findstr Word
Ändern Sie es, um die direkten Argumente am Ende des Werts, einschließlich des Leerzeichens, zu entfernen und zu werden:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Für Excel 64-Bit)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Für Word 64-Bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Für Word 32-Bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Für Excel 32-Bit)
Geben Sie den Schlüssel mit dem Namen ddeexec
(falls er nicht vorhanden ist, erstellen Sie den Schlüssel) ein, der sich neben dem command
Schlüssel befindet. Klicken Sie mit der rechten Maustaste auf den (Default)
Wert, klicken Sie im Kontextmenü auf "Ändern" und legen Sie den folgenden Wert fest:
[REM _DDE_Direct][FileOpen("%1")]
- (Für Word)
[open("%1")]
- (Für Excel)
ddeexec
Erstellen Sie darunter einen neuen Schlüssel mit dem Namen topic
(falls nicht vorhanden), klicken Sie mit der rechten Maustaste auf den (Default)
Wert, klicken Sie im Kontextmenü auf "Ändern" und legen Sie den Wert fest system
(falls nicht bereits vorhanden).
Nach den Änderungen müssen Sie möglicherweise shell32.dll aktualisieren, indem Sie diese mit einer Eingabeaufforderung oder Shell mit erhöhten Rechten ausführen, nachdem Sie diese Änderungen an der Registrierung erstellt haben:
regsvr32 /i shell32.dll
Dies wurde unter Windows 10 Office 2016 Version 16.0.8625.2127 getestet
Alternative Verknüpfung
Sie können auch zum Schlüssel für Dateierweiterungen (z. B. HKEY_CLASSES_ROOT\.xlsx
) gehen und den Wert "(Standard)" in eine einzelne Klasse ändern. Wenn dieser Ansatz befolgt wird, können mehrere Dateierweiterungen auf denselben Klassenwert (z. B. Excel.Sheet.12
) verweisen, den Sie verwenden Diese Klasse muss nur einmal mit der DDE-Nachricht geändert werden. Wenn Sie dies tun, sollten Sie auch alle Wiederholungen des Klassennamens in diesem Registrierungszweig umbenennen. Diese Methode wird jedoch nicht empfohlen, da sie leicht beschädigt werden kann und durchgeführt werden sollte, wenn Sie alle Dateierweiterungen durchführen, um Zeit zu sparen.
Nebenbemerkungen:
Das /o
Argument ist ein Argument für URLs, daher ist es kein großes Problem, diese Funktionalität zu verlieren, da sie selten übergeben wird. Wenn Sie dies wünschen, können Sie versuchen, diesen Teil des Arguments beim Anpassen der (Default)
Werte beizubehalten .
Ich denke darüber nach, dies zu einem Community-Wiki zu machen, da es sehr spekulativ und auch unvollendet ist (wenn Word & Excel nicht die einzigen wären). Bitte kommentieren Sie dazu eine Meinung.