Tôi xin lỗi nếu tôi nhắc lại các giải thích của mình trong suốt, nhưng tôi thấy vấn đề này rất phức tạp vì vậy tôi đã cố gắng đảm bảo nó theo ngữ cảnh có ý nghĩa với độc giả:
Mặc dù có thể không biết đây là lỗi hay đã được dự định, chúng tôi có thể buộc nó mở trong trường hợp "tương tự" bằng cách sử dụng giao thức Trao đổi dữ liệu động (DDE) bằng cách tạo thông báo DDE thay vì đối số cứng "% 1 "chỉ vào tệp cho trường hợp đó để mở khi thực hiện tệp. (Mặc dù, DDE được sử dụng ngay cả với đối số cứng).
Thông báo DDE, trong trường hợp này, được sử dụng để báo cho chương trình mở tệp. Đối với mỗi tệp được thực thi, nó thực sự tạo ra một thể hiện mới mỗi lần. Nhưng khi giao thức DDE được sử dụng, trước tiên, nó sẽ kiểm tra xem một cá thể đã được tạo chưa và nếu vậy nó sẽ chuyển tiếp thông điệp DDE đến phiên bản đầu tiên được tìm thấy và thoát ra do đó tạo ra ảo tưởng rằng tất cả các tệp mở trong một cá thể vì nó là tức thời.
Suy đoán
Vấn đề của các tệp mở trong nhiều phiên bản có khả năng liên quan đến số lượng một cá thể đã được tải khi một phiên bản khác đang được gọi. Xu hướng giữa chênh lệch thời gian thực hiện của một thể hiện thứ hai là khi thời gian giữa các lần thực thi tăng lên, nó có xu hướng mang lại một thể hiện duy nhất và khi nó giảm có xu hướng sinh ra hai thể hiện. Điều này cho thấy rằng phiên bản đầu tiên phải được tải hoặc "sẵn sàng" để mở một tệp mới trong cùng thể hiện đó nếu một tệp khác được thực thi và nếu không thì nó sẽ tự mở tệp.
Có vẻ như khi đường dẫn tệp được sử dụng làm đối số cho chương trình, nó dường như chỉ đi theo xu hướng này:
Khi được sử dụng làm đối số để tạo các thể hiện ngoài phiên bản đầu tiên nếu phiên bản đầu tiên đã sẵn sàng (hoặc nếu những người không phải là người đầu tiên thấy điều đó đã sẵn sàng), thì phiên bản không phải là lần đầu tiên dường như có thể chuyển đối số dưới dạng tin nhắn DDE sang lần đầu tiên.
Tuy nhiên, nếu chúng tôi thực thi chương trình và sử dụng thông báo DDE để mở tệp, nó dường như tuân theo giao thức DDE ngay lập tức cho dù phiên bản đầu tiên có sẵn sàng chấp nhận thông báo DDE thông qua đối số hay không. Việc phiên bản đầu tiên có sẵn sàng hay không phụ thuộc vào việc người đầu tiên không xem phiên bản đầu tiên là sẵn sàng hay chưa và nếu nó không gửi tin nhắn DDE đến lần đầu tiên, điều này dường như chỉ xảy ra khi nó mở thông qua đối số . Suy đoán của người đầu tiên nhìn thấy lần đầu tiên là không "sẵn sàng" hoặc "không tồn tại" được đề xuất bởi thực tế là các tin nhắn DDE (từ những người không phải là người đầu tiên) được chấp nhận bởi người đầu tiên khi: người đầu tiên không được thực hiện thông qua một phép nối đối số "% 1"; và nó được yêu cầu mở thông qua tin nhắn DDE.
Như suy đoán của tôi là: mã cho các ứng dụng này sử dụng một số phương thức tối nghĩa để xác định xem một thể hiện khác có "sẵn sàng" hay không và nếu vậy thì sẽ sử dụng giao thức DDE khi sử dụng đối số. Điều này dường như sử dụng một phương thức khác với chỉ khi nó nhận được giao thức DDE để xác định xem có nên gửi nó đến một thể hiện khác hay không. Nó sẽ xuất hiện trong hiệu ứng mã giả là:
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();
}
}
Không có cách nào để nói nếu đây là một lỗi hoặc nó được dự định là tối nghĩa vì một lý do, mà không có các lập trình viên thông báo cho chúng tôi.
Độ phân giải
Chúng tôi muốn điều chỉnh việc thực thi các phần mở rộng tệp nhất định để không còn gửi đường dẫn tệp ("% 1") của tệp đang được thực thi dưới dạng đối số, nhưng nói cho chương trình được thực thi để thực hiện với nội dung của thông báo DDE, trong đó chứa một yêu cầu để mở một tệp, nó sẽ chuyển tiếp nó đến một thể hiện đã tồn tại nếu tồn tại và nếu không sử dụng chính nó. Theo suy đoán, sẽ bỏ qua các yêu cầu tối nghĩa của các ứng dụng này để một trường hợp khác được coi là "sẵn sàng" nếu một đối số cho đường dẫn tệp được sử dụng.
Đây là tất cả các phần mở rộng tệp tương quan với các khóa Class sẽ được thay thế bằng x
:
Cho 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
Dành cho 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
* Các phần mở rộng tệp quan trọng / phổ biến nhất nên được thực hiện ở mức tối thiểu. Chủ quan.
Phần mở rộng tập tin quan trọng / phổ biến thứ cấp nên được thực hiện ở mức tối thiểu. Chủ quan.
Các danh sách này có thể được sao chép thông qua dòng lệnh: assoc | findstr Word
thay thế Word
bằng tên rút gọn chính thức (phân biệt chữ hoa chữ thường).
Tất cả trong số đó bạn có tùy chọn để làm nếu bạn cảm thấy cần thiết. Nếu bạn càng muốn làm, bạn có thể muốn làm theo các bước có thể lựa chọn mà tôi sẽ cung cấp, điều này sẽ làm giảm công việc cần thiết.
Bạn sẽ làm theo các hướng dẫn sau cho mọi khóa đăng ký bên dưới thay thế x
bằng (các) Lớp tương ứng của (các) lựa chọn của bạn:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Ví dụ HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
:)
Một lần nữa, OpenAsReadOnly
khóa, có thể tùy chọn, điều này sẽ sẵn sàng khi tệp được thực thi sao cho nó chỉ đọc.
Một biện pháp phòng ngừa nhỏ - một bản sao lưu
Để nhớ tốt nhất các giá trị đăng ký là gì trước khi sửa đổi, bạn có thể muốn nhấp chuột phải vào nhánh chính HKEY_CLASSES_ROOT
và trong menu ngữ cảnh, nhấp vào "Xuất" và lưu Tệp đăng ký vào một vị trí. Trong trường hợp Doc Brown nói "Chúng tôi cần quay lại", bạn chỉ có thể nhập khóa đăng ký bằng cách thực hiện nó và làm theo hướng dẫn.
Ngoài ra, bạn cũng có thể chạy cái này để bạn nhớ những command
giá trị và tên Class là gì để sửa những lỗi nhỏ với:
assoc>>fileexts.txt
có thể được lọc bằng cách sử dụng type fileexts.txt | findstr Word
ftype>>classnames.txt
có thể được lọc bằng cách sử dụng type classnames.txt | findstr Word
Hướng dẫn
Chúng phải được tuân theo cho mọi giá trị chính được liệt kê ở trên, như bạn muốn làm.
Nhập vào trình soạn thảo đăng ký yêu thích của bạn hoặc regedit
đi đến Lớp bạn muốn sửa đổi.
Nhập vào khóa được gọi command
, nhấp chuột phải vào (Default)
giá trị và nhấp vào "Sửa đổi" trong menu ngữ cảnh.
Hiện tại thiết lập phải là những gì đã được thực hiện bởi ftype | findstr Word
Thay đổi nó để loại bỏ các đối số trực tiếp ở cuối giá trị, bao gồm cả khoảng trắng, để trở thành:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Đối với Excel 64-bit)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Đối với Word 64-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Đối với Word 32-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Đối với Excel 32-bit)
Nhập vào khóa được gọi ddeexec
(nếu nó không tồn tại, tạo khóa) bên cạnh command
khóa, nhấp chuột phải vào (Default)
giá trị và nhấp vào "Sửa đổi" trong menu ngữ cảnh và đặt giá trị thành:
[REM _DDE_Direct][FileOpen("%1")]
- (Đối với Word)
[open("%1")]
- (Đối với Excel)
Bên dưới ddeexec
tạo một khóa mới được gọi là topic
(nếu nó không tồn tại), nhấp chuột phải vào (Default)
giá trị và nhấp vào "Sửa đổi" trong menu ngữ cảnh và đặt giá trị thành system
(nếu chưa có).
Sau khi sửa đổi, bạn có thể phải làm mới shell32.dll bằng cách chạy lệnh này với Dấu nhắc lệnh hoặc trình bao nâng cao sau khi tạo các thay đổi này cho sổ đăng ký:
regsvr32 /i shell32.dll
Điều này đã được thử nghiệm trên Windows 10 Office 2016 Phiên bản 16.0.8625.2127
Phím tắt thay thế
Bạn cũng có thể đi tới khóa để mở rộng tệp (chẳng hạn như HKEY_CLASSES_ROOT\.xlsx
) và sửa đổi giá trị "(Mặc định)" thành một lớp số ít, cách tiếp cận này, nếu được theo dõi, có thể trỏ nhiều phần mở rộng tệp vào cùng một giá trị Lớp (như Excel.Sheet.12
) chỉ phải sửa đổi lớp đó một lần với Thông báo DDE. Nếu bạn làm điều này cũng nên đặt tên lại tất cả các lần lặp lại của tên Class bên trong nhánh đăng ký đó. Tuy nhiên, cách này không được khuyến khích, vì nó có thể dễ dàng bị hỏng và nên được thực hiện nếu bạn thực hiện tất cả các tiện ích mở rộng tệp để tiết kiệm thời gian.
Sidenote:
Đối /o
số là một đối số cho các URL, vì vậy không phải là mối quan tâm lớn khi mất chức năng này vì nó hiếm khi được thông qua. Tuy nhiên, nếu bạn muốn, bạn có thể thử và bỏ phần này của đối số khi điều chỉnh các (Default)
giá trị.
Tôi đang xem xét để biến đây thành một wiki cộng đồng, vì nó rất đầu cơ và cũng chưa hoàn thành (nếu Word & Excel không phải là những người duy nhất). Hãy bình luận một ý kiến về điều này.