如何在一个应用程序中将一个文件在另一个程序中打开 C++实现

时间:2022-06-17 19:46:25
现在公司需要做无纸化,需要用第三方软件STPVIEWER 或 creo viewer (两个都是一种3D设计图档查看软件)  打开图档,但是考虑到用户通过扫描枪设备无法使用鼠标,而软件双击图档会重新开一个进程,如果用户多次打开不同的图档,则会开启多个程式,且启动速度很慢,我现在需要一个方法只让他在当前程式下打开,该软件好像只支持拖动文件时或通过软件内文件->打开才不会打开新的进程。

我现在能有的方法就是

1,使用shellexecute 来启动软件,打开文件,但这样就会启动多个。

2,使用消息WM_DROGFILES 来发送拖动文件消息,我自已做的测试程式都可以接收到拖动消息,并取得数据,但是用到软件上就失效了,用发送文件拖动消息的方式连iexcplore都没有反应,win7 和xp上都失败。

不知道 现在最新的实现文件拖动打开文件的方法有哪些?有什么方法能让我实现通过一个程式模拟拖动文件到对应程式的窗体,然后打开该文件?或者有哪位专家能够给我一个好的实现方案。

没办法,公司有微软正版权限但就是不给我用,但却要让我开发这样的功能,所以在技术论坛让问各位专家。

11 个解决方案

#1


被调用的程序能不能单实例
这种需求有点怪啊。

#2


不能单实例,可以多个运行。没有办法公司要无纸化,而图档是必须要看的,但没有自己的软件能够看图,只能用别人的软件,但又需要加以控制。
这种需求怪的原因是,图档存在我们的系统里面,我们可能控制图档的下载与上传以及位置,但是却没有办法看图,如果有哪位大侠觉得有更好的方式,不防指点。最关键的是用户是报着扫描枪去扫一堆的系统条码,我们跟据条码需要显示出图档,而用户是看大屏幕,或其它显示设备,但是会不在电脑边上。

#3


扫描枪是无线的。

#4


有大神支招没有,专家来救一下急啊。

#5


《Windows核心编程》

#6


这不是OLE嘛?,非常古老的技术了,不知道第三方软件STPVIEWER 或 creo viewer支不支持。

#7


没有说明文档,不知道支不支持OLE,其实我不想把他嵌入我的程式。windows核心编程看完都下课了。能来点快准恨的不?说点实际的吧。

#8


不知道我的理解是否正确:
单从需求来说,应该不难吧,最简单的调用CMD命令打开文件(从另一个程序打开文件),这满足你的需求吧。
或者通过main函数的参数传递,两个程序按约定的命令格式,做打开操作也能实现吧,与前面原理类似。

#9


说说我的想法, 具体还要你自己去试:
模拟人手动操作过程.
键盘模拟ctrl+O (即打开文件的快捷键).
等待"打开对话框"弹出后, 向其中的文件名编辑框中发送WM_SETTEXT消息,设置要打开的文件绝对路径.
再模拟点击确定按钮,或者向"打开对话框"发送WM_COMMAND消息,确定按钮的ID一般是IDOK(如果自定义的文件对话框则可能不是).

最好的方法还是看软件中是否有"只运行一个实例"的选项, 这样就可以方便的使用命令行方式.

#10


要不,你给他开个远程线程吧
该线程用于处理拖动消息,或者发送命令。

至于只运行一个实例,你自己管理就行了。
通过枚举进程,得到程序是否,已经加载的信息。

#11


能说得具体一点吗?

#1


被调用的程序能不能单实例
这种需求有点怪啊。

#2


不能单实例,可以多个运行。没有办法公司要无纸化,而图档是必须要看的,但没有自己的软件能够看图,只能用别人的软件,但又需要加以控制。
这种需求怪的原因是,图档存在我们的系统里面,我们可能控制图档的下载与上传以及位置,但是却没有办法看图,如果有哪位大侠觉得有更好的方式,不防指点。最关键的是用户是报着扫描枪去扫一堆的系统条码,我们跟据条码需要显示出图档,而用户是看大屏幕,或其它显示设备,但是会不在电脑边上。

#3


扫描枪是无线的。

#4


有大神支招没有,专家来救一下急啊。

#5


《Windows核心编程》

#6


这不是OLE嘛?,非常古老的技术了,不知道第三方软件STPVIEWER 或 creo viewer支不支持。

#7


没有说明文档,不知道支不支持OLE,其实我不想把他嵌入我的程式。windows核心编程看完都下课了。能来点快准恨的不?说点实际的吧。

#8


不知道我的理解是否正确:
单从需求来说,应该不难吧,最简单的调用CMD命令打开文件(从另一个程序打开文件),这满足你的需求吧。
或者通过main函数的参数传递,两个程序按约定的命令格式,做打开操作也能实现吧,与前面原理类似。

#9


说说我的想法, 具体还要你自己去试:
模拟人手动操作过程.
键盘模拟ctrl+O (即打开文件的快捷键).
等待"打开对话框"弹出后, 向其中的文件名编辑框中发送WM_SETTEXT消息,设置要打开的文件绝对路径.
再模拟点击确定按钮,或者向"打开对话框"发送WM_COMMAND消息,确定按钮的ID一般是IDOK(如果自定义的文件对话框则可能不是).

最好的方法还是看软件中是否有"只运行一个实例"的选项, 这样就可以方便的使用命令行方式.

#10


要不,你给他开个远程线程吧
该线程用于处理拖动消息,或者发送命令。

至于只运行一个实例,你自己管理就行了。
通过枚举进程,得到程序是否,已经加载的信息。

#11


能说得具体一点吗?