随笔-23  评论-9  文章-0  trackbacks-0

C#使用SendMessage内情

在C#中使用SendMessage,原本以为很简单的事,却处处碰壁。
在定义消息时忘记了用户可定义消息的边界值,在网上一阵疯找后来发现是const int WM_USER = 0x400。
接着是SendMessage的lParam类型不能决定(默认是IntPtr),我想发送字符串信息,就将它定为了string型,然后通过重写DefWndProc接收自定义消息。问题出现:(string) message.lParam提示不能转换,然后使用另一种方法:(string)message.GetLParam(typeof(string)),依然有错,提示应该重载string的构造函数建立string的无参构造函数(够狠)。
后来在网上见到一篇文章“C#用WM_COPYDATA消息来实现两个进程之间传递数据”,经提示想到一方法:用结构体封装string字段,然后传结构体就可以了(结构体有自己的无参构造函数--其实原本想自己写个无参构造函数,却发现在vs2005下无法编译通过,提示不能够创建结构体的无参构造函数)。这样就可以在DefWndProc中通过 (tagStructStr)message.GetLParam(typeof(tagStructStr)) 将LParam转换为结构体类型,然后取出它的字符串字段就实现了string的传送了。
事还没完,一次偶尔碰到有人说可以使用Marshal转换string。自己查了下MSDN于是一个传送string的另一方法产生:SendMessage仍然是传string,在DefWndProc中可以用 string str = Marshal.PtrToStringAnsi(m.LParam) 将IntPtr类型的LParam转换为string类型,其实还可以使用 IntPtr p = Marshal.StringToHGlobalAnsi(s) 将string类型转换为IntPtr类型。
进一步深究,发现这其中还有内情:SendMessage使系统API,IntPtr属于非托管类型,而我们在C#中使用的string等类型是托管类型,使用Marshal转换其实真正意义是实现了托管与非托管类型的转换。看来在C#与非托管的C++/C进行交互传递数据时,要少不了Marshal的身影了。
通过一个SendMessage竟然学到了这么多,真是没有想到!在这blog出来与大家分享,当然个人技术水平有限能看到的只有这个程度,题目没敢说内幕,只写个内情,见笑了
posted on 2007-08-29 16:44 XuQ 阅读(5073) 评论(5) 编辑 收藏

评论:
#1楼 2008-04-16 17:49 | dreamsnake[未注册用户]
您好.正好这两天有个类似的任务.

看了您的文章,收获颇多.不过,目前,我按照结构体中使用 String 的方式,以及 Marshal 的转换方法,都没有得到消息的字符串.感觉很困惑.

另一方面,我的程序 C# 程序将来可能会配合各种不同的Win32程序协同工作. 对于用结构体的方式,不知道会不会给Win32程序的编写造成困绕.

这个接收带字符串的消息的问题,已经困绕我好几天了.实在是头疼的要命.如果可以的话,请将你这部分的代码(发送与接收),发送到我的邮箱里,万分感谢.

另外:可不可以告知一下您的QQ或MSN,可以随时向您请教探讨.

 回复 引用   
#2楼[楼主] 2008-04-18 20:46 | XuQ      
请教不敢当,是去年作C#时遇到的一个问题,现在已经转为c++,源码也已经没有了,实在抱歉,。
我感觉在确认得到消息的情况下,你可以看看
1 是否将字符串用sendmessage发出去
2 得到message的LParam中是否有数据
应该主要是托管类型与非托管类型间数据结构不一致造成,你再研究下marshal的用法,应该能找到问题所在。
好久不做c#了,可能分析的不对,仅供参考。

如果不介意,可以发源码给我看看。

 回复 引用 查看   
#3楼 2009-04-16 11:18 | confucios[未注册用户]
好,多谢
 回复 引用   
#4楼 2009-07-24 11:15 | ylsaga[未注册用户]
Marshal.StringToHGlobalAnsi(s) 转换成Intptr后,在接收方使用string str = Marshal.PtrToStringAnsi(m.LParam)获取的str怎么是乱码啊?
 回复 引用   
#5楼 2009-07-24 14:41 | ylsaga[未注册用户]
刚发现m.LParam的值发送前后不同了
 回复 引用   
昵称:XuQ
园龄:4年5个月
粉丝:0
关注:1
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

搜索

 
 

常用链接

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜