Mi scuso se ribadisco le mie spiegazioni in tutto, ma trovo questo problema molto complesso, quindi ho cercato di garantire che abbia senso contestualmente ai lettori:
Anche se potrebbe non essere noto se si tratta di un bug o se era previsto, possiamo forzarlo ad aprirlo nella "stessa" istanza utilizzando il protocollo DDE (Dynamic Data Exchange) creando un messaggio DDE anziché l'argomento rigido "% 1 "che punta al file per quell'istanza da aprire durante l'esecuzione del file. (Anche se, DDE viene utilizzato anche con l'argomento difficile).
Il messaggio DDE, in questo caso, viene utilizzato per indicare al programma di aprire un file. Per ogni file eseguito crea effettivamente una nuova istanza ogni volta. Ma quando viene utilizzato il protocollo DDE, viene innanzitutto esaminato se un'istanza è già stata creata e, in tal caso, inoltra il messaggio DDE alla prima istanza trovata ed esce dando così l'illusione che tutti i file si aprano in una singola istanza in quanto istantanea.
speculazioni
Il problema dell'apertura dei file in istanze multiple ha probabilmente a che fare con quanto una singola istanza è già stata caricata quando viene chiamata un'altra istanza. La tendenza tra la differenza del tempo di esecuzione di una prima seconda istanza è quando il tempo tra le esecuzioni aumenta tende a produrre una singola istanza e mentre diminuisce tende a produrre due istanze. Ciò suggerisce che la prima istanza deve essere caricata o "pronta" per aprire un nuovo file nella stessa istanza se viene eseguito un altro file e, in caso contrario, aprirà il file con se stesso.
Sembra che quando il percorso del file viene utilizzato come argomento per il programma, sembra seguire questa tendenza solo per:
Se utilizzato come argomento per la creazione di istanze oltre la prima istanza se la prima è pronta (o se i primi non vedono che è pronta), la non prima istanza sembra essere in grado di trasmettere l'argomento come messaggio DDE alla prima.
Tuttavia, se eseguiamo il programma e utilizziamo un messaggio DDE per aprire il file, sembra seguire immediatamente il protocollo DDE se la prima istanza è pronta o meno ad accettare il messaggio DDE tramite argomento. Il fatto che la prima istanza sia pronta o meno dipende probabilmente dal fatto che il non primo veda la prima istanza come pronta e, in caso contrario, non invierà il messaggio DDE al primo, che sembra verificarsi solo quando si apre tramite argomento . La speculazione del non primo che vede il primo come non "pronto" o "inesistente" è suggerita dal fatto che i messaggi DDE (dai non primi) sono accettati dal primo quando: il non primo non viene eseguito tramite una concatenazione di argomenti "% 1"; e gli viene detto di aprirsi tramite un messaggio DDE.
In quanto tale la mia speculazione è: il codice per queste applicazioni usa un metodo oscuro per determinare se un'altra istanza è "pronta" e, in tal caso, userebbe il protocollo DDE quando viene usato un argomento. Questo sembra utilizzare un metodo diverso rispetto a quando riceve il protocollo DDE per determinare se inviarlo a un'altra istanza. Sembrerebbe in effetti che lo pseudocodice fosse:
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();
}
}
Non c'è modo di dire se si tratta di un bug o se si intendeva che fosse oscuro per una ragione, senza che i programmatori ci informassero.
La risoluzione
Vogliamo regolare l'esecuzione di determinate estensioni di file per non inviare più il percorso del file ("% 1") del file in esecuzione come argomento, ma piuttosto dire al programma in esecuzione di eseguire il contenuto del messaggio DDE, di cui contiene una richiesta per aprire un file, che lo inoltrerà a un'istanza già esistente se esiste e se non lo utilizza da solo. Che speculativamente, ignorerà i requisiti oscuri di queste applicazioni affinché un'altra istanza sia vista come "pronta" se viene utilizzato un argomento per il percorso del file.
Queste sono tutte estensioni di file correlate alle chiavi di classe che devono essere sostituite con x
:
Per parola
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
Per 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
* Le estensioni di file più importanti / comuni che dovrebbero essere eseguite come minimo. Soggettivo.
† Estensioni di file secondarie più importanti / comuni che dovrebbero essere eseguite come minimo. Soggettivo.
Questi elenchi possono essere replicati dalla riga di comando: assoc | findstr Word
sostituendo Word
con il nome abbreviato ufficiale (con distinzione tra maiuscole e minuscole).
Tutto ciò che hai la possibilità di fare se lo ritieni necessario. Se più desideri fare, potresti voler seguire i passaggi opzionali che fornirò, che dovrebbero ridurre il lavoro necessario.
Dovrai seguire le seguenti istruzioni per ogni chiave di registro di seguito sostituendo la x
con le Classi corrispondenti di tua scelta:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Es: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
)
Ancora una volta, la OpenAsReadOnly
chiave è opzionale, questo sarà pronto quando il file verrà eseguito in modo tale da essere di sola lettura.
Una piccola precauzione: un backup
Per ricordare meglio quali erano i valori del registro prima della modifica, potresti voler fare clic con il pulsante destro del mouse sul ramo chiave HKEY_CLASSES_ROOT
e nel menu contestuale fare clic su "Esporta" e salvare il file di registrazione in un percorso. Nel caso in cui Doc Brown affermi "Dobbiamo tornare indietro", puoi semplicemente importare la chiave di registro eseguendola e seguendo le istruzioni.
In alternativa, puoi anche eseguirlo in modo da ricordare quali command
valori e nomi delle classi dovevano correggere piccoli errori con:
assoc>>fileexts.txt
che può essere filtrato usando type fileexts.txt | findstr Word
ftype>>classnames.txt
che può essere filtrato usando type classnames.txt | findstr Word
Istruzioni
Questi devono essere seguiti per ogni valore chiave sopra elencato, come desideri fare.
Accedi al tuo editor di registro preferito o regedit
vai alla classe che desideri modificare.
Inserisci nella chiave chiamata command
, fai clic con il pulsante destro del mouse sul (Default)
valore e fai clic su "Modifica" nel menu contestuale.
Attualmente impostato dovrebbe essere quello che è stato eseguito da ftype | findstr Word
Modificalo per rimuovere gli argomenti diretti alla fine del valore, incluso lo spazio, per diventare:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Per Excel 64 bit)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Per Word 64 bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Per Word a 32 bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Per Excel a 32 bit)
Inserisci la chiave chiamata ddeexec
(se non esiste, crea la chiave) che sarebbe accanto alla command
chiave, fai clic con il pulsante destro del mouse sul (Default)
valore e fai clic su "Modifica" nel menu contestuale e imposta il valore in modo che diventi:
[REM _DDE_Direct][FileOpen("%1")]
- (Per Word)
[open("%1")]
- (Per Excel)
Sotto ddeexec
crea una nuova chiave chiamata topic
(se non esiste), fai clic con il pulsante destro del mouse sul (Default)
valore, quindi fai clic su "Modifica" nel menu contestuale e imposta il valore in modo che diventi system
(se non già).
Dopo le modifiche potrebbe essere necessario aggiornare shell32.dll eseguendolo con un prompt dei comandi elevato o shell dopo aver creato queste modifiche al registro:
regsvr32 /i shell32.dll
Questo è stato testato su una versione di Windows 10 Office 2016 16.0.8625.2127
Scorciatoia alternativa
Puoi anche andare alla chiave per le estensioni di file (come HKEY_CLASSES_ROOT\.xlsx
) e modificare il valore "(Predefinito)" in una singola classe, questo approccio, se seguito, può puntare più estensioni di file allo stesso valore di Classe (come Excel.Sheet.12
) che devi modificare quella classe solo una volta con il messaggio DDE. Se lo fai, dovresti anche rinominare tutte le reiterazioni del nome della classe all'interno di quel ramo del registro. Tuttavia, questo modo non è raccomandato, in quanto potrebbe facilmente rompersi e dovrebbe essere fatto se si dovessero fare tutte le estensioni dei file per risparmiare tempo.
Note a margine:
L' /o
argomento è un argomento per gli URL, quindi non è una grande preoccupazione nel perdere questa funzionalità poiché raramente viene passata. Tuttavia, se lo desideri, puoi provare a lasciare questa parte dell'argomento attiva quando modifichi i (Default)
valori.
Sto pensando di rendere questo un wiki della comunità, poiché è molto speculativo e anche incompiuto (se Word ed Excel non fossero i soli). Si prega di commentare un'opinione su questo.