如何知道Sendmessage送的COPYDATASTRUCT具体内容呢?

问题描述

具体问题如下,后台开了4个进程,4个进程分别从不同的目录启动,我希望能指定某个进程打开文件(比如“d:1.dat”),需要先找到这几个进程,然后通过不同的启动目录进行区别进行调用首先尝试的是找到进程,然后通过发送快捷键组合,后来发现成功不了,问题见另外一个链接。http://bbs.csdn.net/topics/391019530早上想到了干脆模拟资源管理器双击文件使进程打开文件的方式,用spy抓取消息分析。正确的消息是:<00019>000603CESWM_COPYDATAhwndFrom:0009075Epcds:0030FD30[wParam:0009075ElParam:0030FD30]于是根据另外一个帖子http://bbs.csdn.net/topics/300042944写出代码,但是我的消息发送失败。stringstr=@"s:1.datance";COPYDATASTRUCTcopyData;copyData.dwData=newIntPtr(0x0009075E);//IntPtr.Zero;copyData.cbData=Encoding.Default.GetByteCount(str.ToCharArray(),0,str.Length);copyData.lpData=str;IntPtrptr=Marshal.AllocHGlobal((IntPtr)(Marshal.SizeOf(copyData)));Marshal.StructureToPtr(copyData,ptr,true);SendMessage(wh,WM_COPYDATA,-1,(int)ptr)

抓取消息显示发送失败<00197>000603CESWM_COPYDATAhwndFrom:FFFFFFFFpcds:0030FD40[wParam:FFFFFFFFlParam:0030FD40]<00198>000603CERWM_COPYDATAfProcessed:False[lResult:00000000]经过对比,发现正确的cbData(26)比错误的cbData(12)数字大。我如何能知道正确消息里面存储lpData的具体内容是啥?

解决方案

本帖最后由 aquayhy 于 2015-04-18 10:29:35 编辑
解决方案二:
刚刚经过测试,把文件名修改为11.datance,抓到正确的cbData变成了28,也就是说文件名中一个字符占两个字节。s:1.datance共13个字符(加上后面的),乘以2为26。如果认为数据应该以unicode方式发送,一个字符占两个字节,尝试着在代码里面把"s:1.datance"里面每个字符前面插上多余的,也不成功。主要原因是不知道lpData数据发送的到底是啥,无法照样进行修改
解决方案三:
经过调试,现在有所进展unsafepublicstructCOPYDATASTRUCT{publicvoid*dwData;publicintcbData;[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStr)]publicstringlpData;}stringstr="s:\a.dat";//IntPtrstrPtr=Marshal.StringToHGlobalAnsi(str);COPYDATASTRUCTcopyData;copyData.dwData=(void*)3735941134;//IntPtr.Zero;copyData.cbData=(str.Length+1)*2;copyData.lpData=str;IntPtrptr=Marshal.AllocHGlobal((IntPtr)(Marshal.SizeOf(copyData)));Marshal.StructureToPtr(copyData,ptr,true);WinHWND.SendMessage(wh.HWND,WinHWND.WM_COPYDATA,0xC080E,(int)ptr);——这里的0xC080E是为了和抓取的正确消息一致,应该是发送的消息的进程,测试修改没有什么影响。

这次能出现打开对话框的画面了,但是提示是无法载入“XXXXXXXXX”:系统找不到指定的文件。应该是发送的lpData内容有问题,不会查,也不会修改。
解决方案四:
瞎猜的“诡媚”开发方法效率太低了。真正的男人都去选择任何一种靠谱的进程间通讯方法搞开发去了。
解决方案五:
引用3楼sp1234的回复:

瞎猜的“诡媚”开发方法效率太低了。真正的男人都去选择任何一种靠谱的进程间通讯方法搞开发去了。

网上搜了一下进程间通讯方法总结为了能在两个进程之间进行通讯,由以下几种方法可供参考: 1、剪贴板Clipboard:在16位时代常使用的方式,CWnd中提供支持  2、窗口消息标准的Windows消息以及专用的WM_COPYDATA消息SENDMESSAGE()接收端必须有一个窗口 3、使用共享内存方式(SharedMemory)  a.设定一块共享内存区域HANDLECreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR)  产生一个file-mapping核心对象LPVOIDMapViewOfFile(HANDLEhFileMappingObject,DWORDdwDesiredAcess,DWORDdwFileOffsetHigh,DWORDdwFileOffsetLow,DWORDdwNumberOfBytesToMap);  得到共享内存的指针  b.找出共享内存  决定这块内存要以点对点(peertopeer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己排在第一位,并接下来将共享内存初始化。  还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用HANDLEOpenFileMapping(DWORDdwDesiredAccess,BOOLbInheritHandle,LPCTSTRlpName);  再调用MapViewOfFile(),取得共享内存的指针  c.同步处理(Mutex)  d.清理(Cleaningup)BOOLUnmapViewOfFile(LPCVOIDlpBaseAddress);CloseHandle() 4、动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能  其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存了,现在的内存只有一种就是虚存。  5、消息管道(MessagePipe)  用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序访问一个平面文件一样读写数据。  匿名管道(AnonymousPipes)  单向流动,并且只能够在同一电脑上的各个进程之间流动。  命名管道(NamedPipes)  双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格式,而使用ReadFile()只能读取该大小的倍数。  可以被使用于I/OCompletionPorts  6、邮件槽(Mailslots)  广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在WIN9X下只支持邮件槽客户  7、Windows套接字(WindowsSocket)  它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应用程序之间可以互相通信。  8、Internet通信它让应用程序从Internet地址上载或下载文件  9、RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。  10、串行/并行通信(Serial/ParallelCommunication)  它允许应用程序通过串行或并行端口与其他的应用程序通信11、COM/DCOM通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。最重要的问题在于:负责打开文件的程序根本就不是我写的,是现成的程序,没有源码、没有任何接口。已经关联过了后缀名,如果直接用系统打开,会调用随机哪个进程进行打开。这个作为学习来研究的。
解决方案六:
没弄清楚,你是要做什么?如果是经由windows资源管理器打开的程序,他的起动参数里面就有。prosess可以非常简单的获得。
解决方案七:
引用5楼zanfeng的回复:

没弄清楚,你是要做什么?如果是经由windows资源管理器打开的程序,他的起动参数里面就有。prosess可以非常简单的获得。

比如双击一个txt程序,启动ultraedit,如果再双击另外一个txt,还是会调用这个ultraedit打开,这个时候传入的参数是什么样的?上面仅仅是个例子。我想通过类似的传入参数的方法,将文件所在的位置字符串,送入某个已有进程内,让它启动该文件。但是目前一直没有成功。

时间: 2024-08-15 20:29:03

如何知道Sendmessage送的COPYDATASTRUCT具体内容呢?的相关文章

欢网科技发布智能导视2.0 利用大数据推送内容

 3月24日消息,今日,智能电视服务商欢网科技发布新产品智能导视2.0,利用大数据分析,主动向用户推送感兴趣的内容.相较于智能导视1.0,智能导视2.0主要是部分功能进行了优化. 在直播推荐方面,智能导视2.0基于大数据的热播节目收视排行和电视群体的用户画像进行校准,通过内容.用户的标签化,实现个性化匹配:在信息及频道的深度运营方面,在用户看广告或换台的时候,可以参与互动活动,让用户不换台或最先选择你喜欢的频道:在内容聚合方面,智能导视2.0升级了点播.回看内容的聚合,回看节目点播化,同时提供节

推送通知iOS客户端编写实现及推送服务器端编写

1.iOS客户端编程 推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商.下面我们看看开发之前的一些准备工作.   配置Xcode工程 编写iOS推送应用需要在Xcode工程中进行一些配置,这些配置是主要是设置代码签名标识,代码签名标识的前提要有配置概要文件(Provisioning Profiles). 有了配置概要文件即可以设置代码签名标识了,需要下载概要文件

“大”网站的内容进化:价值内容如何展现

"大"网站,即在行业内有一定地位的网站,这样的网站在内容上是有了一定的积累,拥有着庞大的内容资源与用户资源. 所谓"成于此,败亦于此",正因为其内容量的庞大,奠定了其行业内的地位,吸引了大量的用户查询资料.学习:但正因为内容量的庞大,也产生了诸如内容质量的参差不齐.用户难以从大量内容中寻找到合适的资料.内容资料陈旧,不再适用--之类的问题,严重影响了用户体验度. 百度知道为代表的问答网站信息的臃肿与真假,新浪.网易为代表的传统资讯门户网站的陈旧资讯信息.天涯社区为代

ios开发:用PHP实现IOS推送

 ios推送消息是个非常有用的功能,许多应用程序都具备了这个功能,成为实时应用的数据流核心.那么我们怎么用php为ios做推送服务呢?下面本文章将为您进行详细讲解. ios消息推送机制可以参考ios消息推送机制实现与探讨. 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/i

HTML5服务器推送技术的相应实现细节

对于某些类型的应用来说,服务器推送事件是最佳的选择.本文对服务器推送技术进行了详细的介绍,包含浏览器端和服务器端的相应实现细节,为在实践中使用该技术提供了指南. 对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应进行处理,展现给用户.响应的格式可能是 HTML.XML 或 JSON 等.随着 REST 架构风格和 AJAX 的流行,服务器更多地使用

ios入门之消息推送详解

前言 在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能--撤回单条通知.更新已展示通知.中途修改通知内容.在通知中显示多媒体资源.自定义UI等功能. 那么在ios10之前,ios的消息推送是怎么分类的呢? ios 10之前 在ios之前,iOS推送分为Local Notifications(本地推送) 和 Remote Notifications(远程推送). 本地推

手机浏览器进化论:工具到入口再到内容服务

手机浏览器从诞生到现在已经走过了十余年的过程,如果只是以2008年划时代的iPhone3G诞生为标志,真正意义上手机浏览器也已有近十年历史.作为一种跨越时代的产品品类,手机浏览器如同跨越了中生代至今依旧保持了较强生命力的鳄鱼一样. 经历了PC到移动的风云变革,用户需求在随着时代的变迁也不断发演变,手机浏览器自身的命运和定位也在不断发生变化.总体而言,手机浏览器的演变历程大抵经历了纯工具.平台入口和内容服务的三部曲.手机浏览器的生命力和进化过程始终都是和用户的需求紧密结合在一起的. 纯工具阶段:U

Android使用个推实现三方应用的推送功能_Android

PS:用了一下个推.感觉实现第三方应用的推送功能还是比较简单的.官方文档写的也非常的明确. 学习内容: 1.使用个推实现第三方应用的推送. 所有的配置我最后会给一个源代码,内部有相关的配置和文档来帮助大家完成配置,在这里就不进行介绍了. 感觉需要写的东西不是非常的多,因为官方的文档已经写的非常的明确了,如何进行配置,导入jar包,.so文件,以及AndroidManifest的文件的相关配置都写的非常的明确.我这里就稍微的简单介绍一下.注册账号什么的我就不说了,这些基本的东西没有减少的必要性.

内容为王是个伪命题,拿什么拯救你传统媒体

中介交易 SEO诊断 淘宝客 云主机 技术大厅 传统纸媒在理论与实践层面都经历了较长的历史发展,积累下了经过时间的积淀与检验的独特优势.纸媒也通过其相对专业的采编队伍.充足的财政拨款以及品牌广告优势在21世纪初横行多年. 然而在新媒体时代,纸媒的衰退已经成为共识.<21世纪经济报道>创始人刘洲伟.<逻辑思维>创始人罗振宇.虎嗅网创始人李珉纷纷逃离传统媒体,在新媒体领域二次创业已经让人们隐隐嗅到了纸媒死亡的气息. 然而,部分传统纸媒从业者面对纸媒的衰落仍不死心,面对巨大的印刷成本.落