WPF -- 使用当前进程打开自定义文件的一种方式
问题描述
当双击打开自定义格式的文件时,希望使用当前正在运行的进程,而不是另起一个进程。
本文介绍一种方式解决如上问题,方案参考user3582780的解答
设置自定义文件格式的默认打开方式
参考链接,具体步骤如下:
- 在HKEY_CLASSES_ROOT中新建项,命名为自定义文件格式(如.custom),设置其默认值(如mycustom);
- 在HKEY_CLASSES_ROOT中新建项,命名为步骤1中的默认值,即mycustom;
- 在mycustom中新建项,命名为DefaultIcon,设置默认值(Icon路径);
- 在mycustom中新建项,命名为shell,在shell中继续新建项open,在open中新建项command,设置其默认值(格式:程序路径 "%1")
使用当前实例打开文件
首先,当双击自定义格式文件进行打开时,会将该文件的路径作为参数传递给程序,因此打开程序应响应启动参数。
在WPF应用程序中,Application的OnStartup方法会携带程序的启动参数(通过Environment也可获取启动参数)。
当双击自定义格式文件时,若有一个实例正在运行,并不会直接使用该实例打开文件,而是会重新打开一个实例。此时需要将新实例的启动参数传递给当前实例并关闭新实例。
本文使用发送窗口消息的方式处理该问题,即使用Win32的SendMessage接口发送参数给当前实例窗口,当前实例响应消息处理即可。具体实现方案如下:
// App
private static Mutex mutex;
protected override void OnStartup(StartupEventArgs e)
{
mutex = new Mutex(true, "myapp", out bool ret);
if(!ret)
Reopen(e);
// ...
}
private void Reopen(StartupEventArgs e)
{
// IntPtr hwnd = FindWindow(null, "window title");
if(e.Args.Length > 0)
SendMessage();
Environment.Exit(0);
}
private void SendMessage(IntPtr hwnd, string data)
{
CopyDataStruct cds = new CopyDataStruct();
try
{
cds.cbData = (data.Length + 1) * 2; // number of bytes
cds.lpData = Win32.LocalAlloc(0x40, cds.cbData); // known local-pointer in RAM
Marshal.Copy(data.ToCharArray(), 0, cds.lpData, data.Length); // Copy data to preserved local-pointer
cds.dwData = (IntPtr)1;
SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, ref cds);
}
finally
{
cds.Dispose();
}
}
// Window
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if(msg == WM_COPYDATA)
{
CopyDataStruct st = (CopyDataStruct)Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
string strData = Marshal.PtrToStringUni(st.lpData);
OpenFile(strData);
Activate();
}
return IntPtr.Zero;
}
WPF -- 使用当前进程打开自定义文件的一种方式的更多相关文章
- C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式
前言 作为项目管理大队中的一员,在公司里面接触最多的就是Excel文件了,所以一开始就想从Excel入手,学习简单的二次开发,开始自己的编程之路! 程序界面 功能说明 打开文件按钮,可以由使用者指定要 ...
- Linux 利用进程打开的文件描述符(/proc)恢复被误删文件
Linux 利用进程打开的文件描述符(/proc)恢复被误删文件 在 windows 上删除文件时,如果文件还在使用中,会提示一个错误:但是在 linux 上删除文件时,无论文件是否在使用中,甚至是还 ...
- s11.1 lsof:查看进程打开的文件
功能说明 lsof 全名为list open files,也就是列举系统中已经被打开的文件,通过lsof命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件. [语法格式] l ...
- lsof恢复进程打开的文件
工作原理:进程每打开文件都会生成一个文件句柄FD来标识一个文件,进程打开的文件如果没有被释放,可以通过文件句柄FD来恢复删除的文件 注意:适合恢复进程一直在打开一个文件,例如日志文件,如果配置文件进程 ...
- Linux 系统管理命令 - lsof - 查看进程打开的文件
命令详解 重要星级: ★★★★★ 功能说明: 全名为 list open files,也就是列举系统中已经被打开的文件,通过 lsof 命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进 ...
- lsof 查看打开了一个文件的有哪些进程 统计那个进程打开的文件最多
lsof | grep /lib64/libc-2.12.so | wc == 查看打开了一个文件的有哪些进程 lsof | awk '{print $2,$1}' | sort | uniq - ...
- 打开cad文件的几种方法
转自原文 打开cad文件的几种方法 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeature ...
- 加载xib文件的两种方式
一.加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@&quo ...
- PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...
随机推荐
- 埋点 & 数据上报 & 数据异常处理
埋点 & 数据上报 & 数据异常处理 如何在用户关闭浏览器前面,发送请求 beforeunload unload https://developer.mozilla.org/en-US ...
- express+mongodb开发网站
准备工作: 1安装git 进入官网 使用方法:使用git教程 2安装node.js 进入官网 3安装mongodb 进入官网 需要技术: 1.基础知识:html .css. js .jquery 2 ...
- 11_MySQL如何让数据分页显示
-- 数据分页 SELECT empno,sal FROM t_emp LIMIT 5;
- Mybatis-06 动态Sql
Mybatis-06 动态Sql 多对一处理 多个学生,对应一个老师 对于学生这边而言,关联多个学生,关联一个老师 [多对一] 对于老师而言,集合,一个老师又很多学生 [一对多] 1.创建数据库 2. ...
- scala函数至简原则是什么?
1.return可以省略,Scala会使用函数体的最后一行代码作为返回值 2.如果函数体只有一行代码,可以省略花括号 3.返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略) 4.如果有 ...
- MySQL5.7.29 和 Navicat ===> windows窗口式按装和使用
MySQL windows窗口式按装下载方法:官网: https://www.mysql.com/ ==> DOWNLOADS ==> MySQL Community (GPL) Down ...
- 微信小程序(七)-项目实例(原生框架 MINA转云开发)==02-云开发-配置
云开发:1.就是用云函数的型式来使用云存储和云数据库完成各种操作! 2.只关注调什么函数,完成什么功能即可,无需关心HTTP请求哪一套! 3.此模式不代表没有服务器,只是部署在云环境中 ...
- JVisualVM监控JVM-外网服务器
环境说明: a:阿里云服务器Centos8.2 b:JDK1.8 1:增加JMV运行参数 java -jar 启动时添加一下参数: -Djava.rmi.server.hostname=外网IP地址 ...
- Oracle check TBS usage
select d.tablespace_name, space||'M' "SUM_SPACE(M")", blocks "SUM_BLOCKS", ...
- Java基本概念:方法
一.简介 描述: Java中方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合,它在类中定义,属于类的成员,包含于类或对象中. 方法在程序中被创建后,在其他使用了该方法的地 ...