ฉันขอโทษถ้าฉันย้ำคำอธิบายของฉันตลอด แต่ฉันพบว่าปัญหานี้ซับซ้อนมากดังนั้นฉันจึงพยายามที่จะทำให้แน่ใจว่าผู้อ่านมีบริบท:
แม้ว่ามันอาจไม่เป็นที่รู้จักว่านี่เป็นข้อผิดพลาดหรือตั้งใจให้เราสามารถบังคับให้เปิดในอินสแตนซ์ "เดียวกัน" โดยใช้โปรโตคอลการแลกเปลี่ยนข้อมูลแบบไดนามิก (DDE) โดยการสร้างข้อความ DDE แทนการโต้แย้งอย่างหนัก "% 1 "ชี้ไปที่ไฟล์เพื่อเปิดอินสแตนซ์นั้นเมื่อเรียกใช้งานไฟล์ (แม้ว่า DDE จะถูกใช้แม้กับอาร์กิวเมนต์ที่ยาก)
ข้อความ DDE ในกรณีนี้ใช้เพื่อบอกโปรแกรมให้เปิดไฟล์ สำหรับทุกไฟล์ที่ดำเนินการมันจะสร้างอินสแตนซ์ใหม่ทุกครั้ง แต่เมื่อใช้โปรโตคอล DDE มันจะตรวจสอบก่อนว่ามีการสร้างอินสแตนซ์หรือไม่และหากเป็นเช่นนั้นจะรีเลย์ข้อความ DDE ไปที่อินสแตนซ์แรกที่พบและออกจากจึงให้ภาพลวงตาว่าไฟล์ทั้งหมดเปิดในอินสแตนซ์เดียว
การคาดเดา
ปัญหาของการเปิดไฟล์ในอินสแตนซ์หลายรายการน่าจะเกี่ยวข้องกับจำนวนอินสแตนซ์เดียวที่โหลดแล้วเมื่อมีการเรียกอินสแตนซ์อื่น แนวโน้มระหว่างความแตกต่างของเวลาดำเนินการของอินสแตนซ์แรกที่สองคือเวลาที่อยู่ระหว่างการดำเนินการเพิ่มขึ้นมีแนวโน้มที่จะให้อินสแตนซ์เดียวและลดลงซึ่งมีแนวโน้มที่จะให้ผลลัพธ์สองอินสแตนซ์ สิ่งนี้ชี้ให้เห็นว่าจะต้องโหลดอินสแตนซ์แรกหรือ "พร้อม" เพื่อเปิดไฟล์ใหม่ในอินสแตนซ์เดียวกันหากมีการเรียกใช้งานไฟล์อื่นและหากไม่ใช่จะเป็นการเปิดไฟล์ด้วยตัวเอง
ดูเหมือนว่าเมื่อใช้พา ธ ไฟล์เป็นอาร์กิวเมนต์ของโปรแกรมดูเหมือนว่าจะเป็นไปตามแนวโน้มนี้เพียง:
เมื่อใช้เป็นอาร์กิวเมนต์สำหรับการสร้างอินสแตนซ์เกินกว่าอินสแตนซ์แรกถ้าแรกพร้อม (หรือถ้าไม่ใช่คนแรกเห็นว่าพร้อม), อินสแตนซ์ที่ไม่ใช่คนแรกดูเหมือนว่าจะสามารถถ่ายทอดอาร์กิวเมนต์เป็นข้อความ DDE ไปที่แรก
อย่างไรก็ตามหากเรารันโปรแกรมและใช้ข้อความ DDE เพื่อเปิดไฟล์ดูเหมือนว่าจะทำตามโปรโตคอล DDE ทันทีว่าอินสแตนซ์แรกพร้อมที่จะรับข้อความ DDE ผ่านการโต้แย้งหรือไม่ ไม่ว่าอินสแตนซ์แรกจะพร้อมหรือไม่นั้นขึ้นอยู่กับว่าผู้ที่ไม่ได้เห็นอินสแตนซ์แรกนั้นพร้อมหรือไม่และจะไม่ส่งข้อความ DDE ไปที่แรกซึ่งดูเหมือนว่าจะเกิดขึ้นเฉพาะเมื่อมันเปิดผ่านการโต้แย้ง . การคาดเดาของผู้ที่ไม่ใช่คนแรกที่เห็นเป็นคนแรกที่ "ไม่พร้อม" หรือ "ไม่มีอยู่จริง" ได้รับการแนะนำโดยข้อเท็จจริงที่ว่าข้อความ DDE (จากคนที่ไม่ใช่คนแรก) ได้รับการยอมรับโดยคนแรกเมื่อ: ไม่ใช่คนแรก การเชื่อมอาร์กิวเมนต์เข้าด้วยกัน "% 1"; และมันบอกให้เปิดผ่านข้อความ DDE
เช่นการเก็งกำไรของฉันคือ: รหัสสำหรับการใช้งานเหล่านี้ใช้วิธีการปิดบังบางอย่างสำหรับการตรวจสอบว่าอินสแตนซ์อื่น "พร้อม" และถ้าเป็นเช่นนั้นจะใช้โปรโตคอล DDE เมื่อมีการโต้แย้ง ดูเหมือนว่าจะใช้วิธีการอื่นที่ต่างจากเมื่อได้รับโปรโตคอล DDE เพื่อพิจารณาว่าจะส่งไปยังอินสแตนซ์อื่นหรือไม่ มันจะปรากฏขึ้นในความเป็นจริง pseudocode คือ:
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 มีคำร้องขอให้เปิดไฟล์ซึ่งจะถ่ายทอดไปยังอินสแตนซ์ที่มีอยู่แล้วหากมีอยู่และหากไม่ได้ใช้มันเอง ซึ่ง speculatively จะข้ามข้อกำหนดที่คลุมเครือของแอปพลิเคชันเหล่านี้เพื่อให้อินสแตนซ์อื่นถูกมองว่า "พร้อม" หากมีการใช้อาร์กิวเมนต์ไปยังพา ธ ของไฟล์
นี่คือนามสกุลไฟล์ทั้งหมดที่สัมพันธ์กับคีย์คลาสซึ่งจะถูกแทนที่ด้วย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
* นามสกุลไฟล์ที่สำคัญ / ทั่วไปที่ควรทำอย่างน้อยที่สุด อัตนัย
extensions นามสกุลไฟล์ที่สำคัญที่สุด / รองทั่วไปที่ควรทำอย่างน้อยที่สุด อัตนัย
รายการเหล่านี้สามารถทำซ้ำผ่าน command-line: assoc | findstr Word
แทนที่Word
ด้วยชื่อที่สั้นลงอย่างเป็นทางการ
ทั้งหมดที่คุณมีตัวเลือกที่จะทำถ้าคุณรู้สึกว่ามันจำเป็น หากคุณต้องการทำมากกว่านี้คุณอาจต้องการทำตามขั้นตอนที่เป็นทางเลือกซึ่งฉันจะให้ซึ่งควรลดงานที่จำเป็น
คุณจะต้องปฏิบัติตามคำแนะนำต่อไปนี้สำหรับรีจิสตรีคีย์ทั้งหมดด้านล่างแทนที่x
คลาสที่เกี่ยวข้องที่คุณเลือก:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Ex: 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 หากคุณทำสิ่งนี้ควรตั้งชื่อ reiterations ทั้งหมดของชื่อ Class ภายในสาขารีจิสตรีนั้น อย่างไรก็ตามไม่แนะนำวิธีนี้เนื่องจากอาจทำให้แตกได้ง่ายและควรทำหากคุณต้องทำนามสกุลไฟล์ทั้งหมดเพื่อประหยัดเวลา
Sidenotes:
/o
อาร์กิวเมนต์เป็นอาร์กิวเมนต์สำหรับ URL จึงไม่ได้เป็นกังวลใหญ่ในการสูญเสียการทำงานนี้มันไม่ค่อยจะถูกส่ง อย่างไรก็ตามหากคุณต้องการคุณสามารถลองและปล่อยให้ส่วนนี้ของอาร์กิวเมนต์เกิดขึ้นเมื่อทำการปรับ(Default)
ค่า
ฉันกำลังพิจารณาที่จะทำให้ชุมชนนี้เป็นวิกิเนื่องจากมันเป็นการเก็งกำไรมากและยังไม่เสร็จ (ถ้า Word & Excel ไม่ใช่คนเดียว) กรุณาแสดงความคิดเห็นความคิดเห็นเกี่ยวกับเรื่องนี้