windows - 如何区分处理从 Windows 资源管理器和 cmd 打开的文件?
问题描述
我们有两种使用应用程序打开文件的方法:
- 双击资源管理器中的文件。Windows 资源管理器将在注册表中搜索其扩展名,找到默认的应用程序命令行 (CLI) 格式字符串,将“%1”参数替换为文件路径,最后运行 CLI。
- 直接在 CLI 中调用应用程序,将文件的路径作为参数传递。
如果事情像上面那样简单,我们应该完美地模仿 CLI 中的双击操作,即,让应用程序无法判断它是从 CLI 调用还是在资源管理器中双击:它们从操作系统接收非常相同的参数. 这是我长期相信的。
然而,MATLAB 打破了我的梦想。我发现 MATLAB 可以区别对待从资源管理器和 CLI 打开的 .m 脚本文件。当已经有一个 MATLAB 实例正在运行时,在资源管理器中双击一个 .m 文件将在现有实例中打开该文件。但是,当我通过从注册表中找到的 CLI 打开文件时,MATLAB 启动了一个新实例!
MATLAB 是如何做到这一点的?是在监控explorer吗?还是将其真正的 CLI 隐藏在其他地方?
我从 HKEY_CLASSES_ROOT\MATLAB.mlx.9.11.0\Shell\Open\command 的注册表中找到了 CLI。默认值为
"C:\Program Files\MATLAB\R2021b\bin\win64\matlab.exe" -r "eval('[WinReg_path,WinReg_name,WinReg_ext]=fileparts(''%1'');cd(WinReg_path);clear WinReg_path WinReg_name WinReg_ext');"
我尝试用文件路径替换 %1 占位符,但新实例仍然启动。太混乱了!
解决方案
推荐阅读
- asp.net - 尝试从无状态 React 组件中的 localStorage 获取数据时出现 NodeInvocationException
- optimization - 为什么通过网络获取资源需要客户端和服务器之间的多次往返?
- python-3.x - tkinter 框架无法正常工作
- apache-kafka-streams - 如何使用处理器 API 访问 DSL 创建的 KTable/GlobalKTable?
- ios - iOS 浏览器中的 CSS 问题
- azure - VSTS 使用 Publish Profile 将 Webapp 发布到 30 多个 appservices
- android - 提高 json 解析性能
- css - tinyMCE style_formats 不使用 CSS 导入的字体
- javascript - 如何通过点击孩子来避免点击父母?
- c# - 在 Db 中保存文件