説明を繰り返し述べた場合はお詫びしますが、この問題は非常に複雑であるため、読者にとって状況に応じて理解できるようにしました。
これがバグなのか意図されたものなのかはわからないかもしれませんが、動的な引数「%」の代わりにDDEメッセージを作成することで、Dynamic Data Exchangeプロトコル(DDE)を使用して、「同じ」インスタンスで強制的に開くことができます。 1 "は、そのインスタンスがファイルの実行時に開くファイルを指します。(ただし、DDEはハード引数でも使用されます)。
この場合、DDEメッセージは、プログラムにファイルを開くように指示するために使用されます。実行されるすべてのファイルに対して、実際には毎回新しいインスタンスが作成されます。しかし、DDEプロトコルが使用されると、最初にインスタンスがすでに作成されているかどうかが調べられ、作成されている場合は、見つかった最初のインスタンスにDDEメッセージが中継されて終了するため、すべてのファイルが単一インスタンスで瞬時に開かれているように見えます。
憶測
複数のインスタンスで開かれるファイルの問題は、別のインスタンスが呼び出されているときに単一のインスタンスがすでにロードされている量に関係している可能性があります。最初のインスタンスと2番目のインスタンスの実行時間の差の傾向は、実行間の時間が増加すると1つのインスタンスを生成する傾向があり、減少すると2つのインスタンスを生成する傾向があります。これは、別のファイルが実行された場合、同じインスタンスで新しいファイルを開くには、最初のインスタンスをロードするか「準備」する必要があり、そうでない場合はそれ自体でファイルを開くことを示唆しています。
ファイルパスがプログラムの引数として使用される場合、この傾向に従うだけのようです。
最初のインスタンスが準備ができている場合(または、最初でないインスタンスが準備ができていることを確認した場合)、最初のインスタンスを超えてインスタンスを作成するための引数として使用すると、最初でないインスタンスは、引数をDDEメッセージとして最初のインスタンスにリレーできるようです。
ただし、プログラムを実行し、DDEメッセージを使用してファイルを開くと、最初のインスタンスが引数を介してDDEメッセージを受け入れる準備ができているかどうかに関係なく、すぐにDDEプロトコルに従うようです。最初のインスタンスの準備ができているかどうかは、非最初のインスタンスが最初のインスタンスを準備ができていると見なし、そうでない場合、最初のインスタンスにDDEメッセージを送信しません。これは、引数を介して開いたときにのみ発生するようです。 。「最初」が「準備完了」または「存在しない」と見なされていない最初の推測は、DDEメッセージ(最初からではない)が最初に受け入れられるという事実によって示唆されています。引数の連結 "%1"; 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
、コンテキストメニューの下の[エクスポート]をクリックして、登録ファイルを特定の場所に保存します。Doc Brownが「戻る必要がある」と言った場合、レジストリキーを実行し、指示に従ってインポートするだけです。
または、これを実行して、次のよう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ビットの場合)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Word 64ビットの場合)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Word 32ビットの場合)
"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メッセージでそのクラスを一度変更するだけで済みます。これを行う場合は、そのレジストリブランチ内のクラス名のすべての繰り返しの名前も変更する必要があります。ただし、この方法は簡単に壊れる可能性があるためお勧めできません。時間を節約するためにすべてのファイル拡張子を使用する場合は、この方法を実行する必要があります。
傍注:
/o
引数には、URLの引数であるので、それはほとんど渡されないよう、この機能を失うことは大きな問題ではありません。ただし、必要に応じて、(Default)
値を調整するときに、引数のこの部分をそのままにしておくことができます。
これは非常に投機的で未完成であるため(WordとExcelだけではなかった場合)、これをコミュニティーWikiにすることを検討しています。これについての意見をコメントしてください。