Je m'excuse si je réitère mes explications tout au long, mais je trouve que ce problème est très complexe, j'ai donc essayé de faire en sorte qu'il ait un sens contextuel pour les lecteurs:
Bien que l'on ne sache pas s'il s'agit d'un bogue ou s'il était prévu, nous pouvons le forcer à s'ouvrir dans la "même" instance en utilisant le protocole Dynamic Data Exchange (DDE) en créant un message DDE au lieu de l'argument dur "% 1 "pointant vers le fichier de cette instance à ouvrir lors de l'exécution du fichier. (Bien que DDE soit utilisé même avec l'argument dur).
Le message DDE, dans ce cas, est utilisé pour indiquer au programme d'ouvrir un fichier. Pour chaque fichier exécuté, il crée en fait une nouvelle instance à chaque fois. Mais lorsque le protocole DDE est utilisé, il examine d'abord si une instance est déjà créée et, dans l'affirmative, il relaie le message DDE à la première instance trouvée et se ferme, donnant ainsi l'illusion que tous les fichiers s'ouvrent dans une seule instance car elle est instantanée.
Spéculations
Le problème de l'ouverture de fichiers dans plusieurs instances a probablement à voir avec la quantité de chargement d'une seule instance lorsqu'une autre instance est appelée. La tendance entre la différence de temps d'exécution d'une première et d'une seconde instance est que lorsque le temps entre les exécutions augmente, il a tendance à produire une seule instance et à mesure qu'il diminue, il a tendance à produire deux instances. Cela suggère que la première instance doit être chargée ou "prête" pour ouvrir un nouveau fichier dans cette même instance si un autre fichier est exécuté, et si ce n'est pas le cas, il doit ouvrir le fichier avec lui-même.
Il semble que lorsque le chemin du fichier est utilisé comme argument pour le programme, il semble suivre cette tendance uniquement:
Lorsqu'elle est utilisée comme argument pour créer des instances au-delà de la première instance si la première est prête (ou si les non-premiers voient que c'est prêt), la non-première instance semble être en mesure de relayer l'argument sous forme de message DDE à la première.
Cependant, si nous exécutons le programme et utilisons un message DDE pour ouvrir le fichier, il semble suivre immédiatement le protocole DDE, que la première instance soit prête ou non à accepter le message DDE via un argument. Le fait que la première instance soit prête ou non dépend probablement si le non-premier voit la première instance comme prête, et si ce n'est pas le cas, il n'enverra pas le message DDE à la première, ce qui ne semble se produire que lorsqu'il s'ouvre via un argument. . La spéculation du non-premier voyant le premier comme non "prêt" ou "inexistant" est suggérée par le fait que les messages DDE (des non-premiers) sont acceptés par le premier quand: le non-premier n'est pas exécuté via une concaténation d'argument "% 1"; et il est dit d'ouvrir via un message DDE.
En tant que telle, ma spéculation est la suivante: le code de ces applications utilise une méthode obscure pour déterminer si une autre instance est "prête" et, dans l'affirmative, utiliserait alors le protocole DDE lorsqu'un argument est utilisé. Cela semble utiliser une méthode différente de celle au moment où il reçoit le protocole DDE pour déterminer s'il faut l'envoyer à une autre instance. Il semblerait en effet que le pseudocode était:
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();
}
}
Il n'y a aucun moyen de savoir s'il s'agit d'un bogue ou s'il était destiné à être obscur pour une raison, sans que les programmeurs nous en informent.
La résolution
Nous voulons ajuster l'exécution de certaines extensions de fichier pour ne plus envoyer le chemin du fichier ("% 1") du fichier en cours d'exécution comme argument, mais plutôt dire au programme en cours d'exécution de s'exécuter sur le contenu du message DDE, dont contient une requête pour ouvrir un fichier, qui le relaiera à une instance déjà existante si elle existe et sinon ne l'utilisera pas elle-même. Ce qui, spéculativement, contournera les exigences obscures de ces applications pour qu'une autre instance soit considérée comme "prête" si un argument du chemin de fichier est utilisé.
Ce sont toutes des extensions de fichier corrélées aux clés de classe qui doivent être remplacées par x
:
Pour 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
Pour 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
* Les extensions de fichier les plus importantes / communes qui devraient être effectuées au minimum. Subjectif.
† Extensions de fichiers secondaires les plus importantes / communes qui devraient être effectuées au minimum. Subjectif.
Ces listes peuvent être répliquées via la ligne de commande: assoc | findstr Word
remplacement Word
par le nom abrégé officiel (sensible à la casse).
Tout ce que vous avez la possibilité de faire si vous le jugez nécessaire. Si plus vous voulez faire, vous voudrez peut-être suivre les étapes optionnelles que je fournirai, ce qui devrait réduire le travail nécessaire.
Vous devez suivre les instructions suivantes pour chaque clé de registre ci-dessous en remplaçant la x
par les classes correspondantes de votre choix:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Ex: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
)
Encore une fois, la OpenAsReadOnly
clé est optionnelle, elle sera prête lorsque le fichier sera exécuté de telle sorte qu'il sera en lecture seule.
Une petite précaution - une sauvegarde
Pour mieux vous rappeler quelles étaient les valeurs du registre avant modification, vous voudrez peut-être aller cliquer avec le bouton droit sur la branche de clé HKEY_CLASSES_ROOT
, et dans le menu contextuel, cliquez sur "Exporter" et enregistrez le fichier d'enregistrement à un emplacement. Dans le cas où Doc Brown dit "Nous devons revenir en arrière", vous pouvez simplement importer la clé de registre en l'exécutant et en suivant les instructions.
Alternativement, vous pouvez également l'exécuter pour vous souvenir des command
valeurs et des noms de classe afin de corriger les petites erreurs avec:
assoc>>fileexts.txt
qui peut être filtré en utilisant type fileexts.txt | findstr Word
ftype>>classnames.txt
qui peut être filtré en utilisant type classnames.txt | findstr Word
Instructions
Ceux-ci doivent être suivis pour chaque valeur clé répertoriée ci-dessus, comme vous le souhaitez.
Entrez dans votre éditeur de registre préféré ou regedit
allez dans la classe que vous souhaitez modifier.
Entrez dans la clé appelée command
, faites un clic droit sur la (Default)
valeur, puis cliquez sur "Modifier" dans le menu contextuel.
La valeur actuellement définie doit être celle exécutée par ftype | findstr Word
Modifiez-le pour supprimer les arguments directs à la fin de la valeur, y compris l'espace, pour devenir:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Pour Excel 64 bits)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Pour Word 64 bits)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Pour Word 32 bits)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Pour Excel 32 bits)
Entrez dans la clé appelée ddeexec
(si elle n'existe pas, créez la clé) qui serait à côté de la command
clé, cliquez avec le bouton droit sur la (Default)
valeur, puis cliquez sur "Modifier" dans le menu contextuel, et définissez la valeur pour devenir:
[REM _DDE_Direct][FileOpen("%1")]
- (pour Word)
[open("%1")]
- (Pour Excel)
En dessous, ddeexec
créez une nouvelle clé appelée topic
(si elle n'existe pas), cliquez avec le bouton droit sur la (Default)
valeur, puis cliquez sur "Modifier" dans le menu contextuel et définissez la valeur pour qu'elle devienne system
(si ce n'est déjà fait).
Après les modifications, vous devrez peut-être actualiser shell32.dll en l'exécutant avec une invite de commandes élevée ou un shell après avoir créé ces modifications dans le registre:
regsvr32 /i shell32.dll
Cela a été testé sur Windows 10 Office 2016 Version 16.0.8625.2127
Raccourci alternatif
Vous pouvez également accéder à la clé des extensions de fichier (telles que HKEY_CLASSES_ROOT\.xlsx
) et modifier la valeur "(par défaut)" en une classe singulière, cette approche, si elle est suivie, peut pointer plusieurs extensions de fichier vers la même valeur de classe (telle que Excel.Sheet.12
) que vous il suffit de modifier cette classe une seule fois avec le message DDE. Si vous faites cela, vous devez également renommer toutes les réitérations du nom de classe dans cette branche de registre. Cependant, cette méthode n'est pas recommandée, car elle pourrait facilement se casser, et devrait être effectuée si vous deviez faire toutes les extensions de fichier pour gagner du temps.
Sidenotes:
L' /o
argument est un argument pour les URL, donc ce n'est pas un gros problème de perdre cette fonctionnalité car elle est rarement transmise. Cependant, si vous le souhaitez, vous pouvez essayer de laisser cette partie de l'argument activée lors du réglage des (Default)
valeurs.
J'envisage d'en faire un wiki communautaire, car il est très spéculatif et également inachevé (si Word et Excel n'étaient pas les seuls). Veuillez commenter une opinion à ce sujet.