当前位置:编程学习 > C#/ASP.NET >>

懂sendmessage或者windows消息机制的进来看看,真心没法了

    我要把指定的消息发送到另一个窗体的某个控件里面,但是后面才明白这是DrectUI技术,所有控件都是画出来的,没有句柄。
    于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
    发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
    但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
    BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~


windows 软件 编码 技术 API --------------------编程问答-------------------- 楼主功力深厚啊,懂 windows 消息机制的人不多了,捕获消息用的什么软件啊,貌似功能好强大!
Unicode 不光指字符,而是要换 SendMessageW。 --------------------编程问答-------------------- 1、这个和消息收发没关系
2、改用Encoding.UTF8编码传递试试
3、使用软件是Spy++,装了.net都有的,在Visual Studio Tools文件夹下 --------------------编程问答--------------------
引用 2 楼 icdbow 的回复:
1、这个和消息收发没关系
2、改用Encoding.UTF8编码传递试试
3、使用软件是Spy++,装了.net都有的,在Visual Studio Tools文件夹下

不行啊。改成UTF8或者其他编码就收到的字符都变了 --------------------编程问答-------------------- 这是我的发送字符代码 

byte[] bt = Encoding.Default.GetBytes(s);
for (int i = 0; i < bt.Length; i++)
{
     SendMessage(yyMainHwnd, 0X102, bt[i], 0);

}
--------------------编程问答-------------------- Unicode 其实是UTF16 ,基础码值和UTF8一样,多了一些字符而已

内存中存储的方式:
UTF16 63 00
UTF8  63

也就是说,Unicode 会多占 1个8位,你的问题应该是接受框将1个字符当作两个字符来读,这样就有问题了

你可以尝试将传入的字符转成byte[]逐一输出,你就可以看到差别了 --------------------编程问答--------------------
引用 5 楼 icdbow 的回复:
Unicode 其实是UTF16 ,基础码值和UTF8一样,多了一些字符而已

内存中存储的方式:
UTF16 63 00
UTF8  63

也就是说,Unicode 会多占 1个8位,你的问题应该是接受框将1个字符当作两个字符来读,这样就有问题了

你可以尝试将传入的字符转成byte[]逐一输出,你就可以看到差别了

上面说了,接收窗体不是我写的,是另一个软件,我不知道他用什么编码读的,不过应该是GB2312,因为我按GB2312的编码发给它就能正确显示,但是GB不能发送音乐符号 啊  --------------------编程问答-------------------- 我没有说接受窗体是你写的,我只是要你捕获内存BYTE而已,你这个就是做外挂嘛。

请不要用猜测的态度写程序:
1、Spy++捕获到了你发送的消息,说明再消息的收发上是没有问题了,这个就是直接给出第一条判断的原因;
2、消息能够正常送到,但是显示不正常,那怎么想也是编码的原因了吧?既然认定,为什么不坚持?
3、做外挂,对方不可能提前告诉你,他如何如何做,这些都是尝试的过程。
4、捕获传入的byte流,只是为了分析,你的程序和下载程序的区别,然后尝试消除区别。
5、如果你发送相同的消息,绝对不会产生不同的结果,这是原则中的原则,不要“感觉一样”,用事实说话吧。 --------------------编程问答--------------------
引用 7 楼 icdbow 的回复:
我没有说接受窗体是你写的,我只是要你捕获内存BYTE而已,你这个就是做外挂嘛。

请不要用猜测的态度写程序:
1、Spy++捕获到了你发送的消息,说明再消息的收发上是没有问题了,这个就是直接给出第一条判断的原因;
2、消息能够正常送到,但是显示不正常,那怎么想也是编码的原因了吧?既然认定,为什么不坚持?
3、做外挂,对方不可能提前告诉你,他如何如何做,这些都是尝试的过程。
4、捕获传入的byte流,只是为了分析,你的程序和下载程序的区别,然后尝试消除区别。
5、如果你发送相同的消息,绝对不会产生不同的结果,这是原则中的原则,不要“感觉一样”,用事实说话吧。

亲,你看我上面的那张图,两个软件发送符号后,接收窗体接收的charcode(这个就是你说的byte流吧)都是63,但就是显示的不同,我就不懂在这儿了。 --------------------编程问答--------------------
引用 楼主 demo816 的回复:
    我要把指定的消息发送到另一个窗体的某个控件里面,但是后面才明白这是DrectUI技术,所有控件都是画出来的,没有句柄。
    于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
    发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
    但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
    BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~



亲,sendmessage能向后台进程发送消息吗?如何实现呢?程序最小化就不行了. --------------------编程问答--------------------
引用 9 楼 u010835229 的回复:
Quote: 引用 楼主 demo816 的回复:

    我要把指定的消息发送到另一个窗体的某个控件里面,但是后面才明白这是DrectUI技术,所有控件都是画出来的,没有句柄。
    于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
    发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
    但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
    BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~



亲,sendmessage能向后台进程发送消息吗?如何实现呢?程序最小化就不行了.

行啊,只要有句柄就行 --------------------编程问答--------------------
引用 10 楼 demo816 的回复:
Quote: 引用 9 楼 u010835229 的回复:

Quote: 引用 楼主 demo816 的回复:

    我要把指定的消息发送到另一个窗体的某个控件里面,但是后面才明白这是DrectUI技术,所有控件都是画出来的,没有句柄。
    于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
    发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
    但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
    BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~



亲,sendmessage能向后台进程发送消息吗?如何实现呢?程序最小化就不行了.

行啊,只要有句柄就行

句柄我获取到了,但是就是没法发送消息,这是我发的帖子,下边有代码,麻烦帮忙看下,谢谢.
http://bbs.csdn.net/topics/390564964 --------------------编程问答--------------------
真晕啊,可能你没懂我的意思,你发送63,显示的是63,你发00 00 63 00 显示的也是63,直接写段你吧。 --------------------编程问答-------------------- 刚刚断网,没发上
//API
[DllImport("user32.dll", EntryPoint = "SendMessageW")]
private static extern int SendMessageW(IntPtr hwnd, int wMsg, int wParam, int lParam); 

//句柄
IntPtr p = new IntPtr(1901882);
//发送
SendMessageW(p, 0x0286, Convert.ToInt32('♪'), 0); --------------------编程问答-------------------- 最后,吐槽下,其实1楼已经给出正确答案了,你后边说不行,我很纳闷。
直到你后边贴代码,发现你没有用sendmessageW

传过去的编码当然错了,以后问问题还是贴下码吧,不然大家绕弯。
这些代码基本上都是公开的,没有什么秘密的,又不是专利产品。。。。 --------------------编程问答--------------------
引用 14 楼 icdbow 的回复:
最后,吐槽下,其实1楼已经给出正确答案了,你后边说不行,我很纳闷。
直到你后边贴代码,发现你没有用sendmessageW

传过去的编码当然错了,以后问问题还是贴下码吧,不然大家绕弯。
这些代码基本上都是公开的,没有什么秘密的,又不是专利产品。。。。

啊,终于弄出来了,灰常感谢!!!!!!
以前就没用过SendMessageW,失败啊,还要学哦
不过还是有点疑问
这是我以前的代码

byte[] bt = Encoding.Default.GetBytes(s);
for (int i = 0; i < bt.Length; i++)
{
    SendMessage(yyMainHwnd, 0X102, bt[i], 0);

}

这是现在可以发音乐符号的

for (int i = 0; i < s.Length; i++)
{
     SendMessageW(yyMainHwnd, 0X102, Convert.ToInt32(s[i]), 0);

}

麻烦问一下以前编码后发送和现在的 Convert.ToInt32有啥区别呢,为什么这个就能发送呢,我编码方面的知识还不够0.0。 --------------------编程问答-------------------- 那个变量 s 是什么?是string?char[]?
Convert.ToInt32 是将字符转换为32位整型,因为C#是强类型语言,上边申明API时候:int wParam ,所以使用对应的类型。
你使用byte[],UTF8是可以的,但是要注意的是 1 byte = 8 bit 也就是只有8位,而
Unicode(UTF16)占用的是16位,也就是你1个字节是无法表示完整的Unicode的,这个时候就要用我们常说的双字节

PS: 其实编码没有什么高深的,只是是否接触过而已

比较推荐的方法是找本简单的汇编书看看,这样知识比较全面,而且会发现所有知识都可以串到一块。
以后碰到类似问题,就得心应手了。

这样就会带着想法写代码,不是不明不白的写。 --------------------编程问答--------------------
引用 16 楼 icdbow 的回复:
那个变量 s 是什么?是string?char[]?
Convert.ToInt32 是将字符转换为32位整型,因为C#是强类型语言,上边申明API时候:int wParam ,所以使用对应的类型。
你使用byte[],UTF8是可以的,但是要注意的是 1 byte = 8 bit 也就是只有8位,而
Unicode(UTF16)占用的是16位,也就是你1个字节是无法表示完整的Unicode的,这个时候就要用我们常说的双字节

PS: 其实编码没有什么高深的,只是是否接触过而已

比较推荐的方法是找本简单的汇编书看看,这样知识比较全面,而且会发现所有知识都可以串到一块。
以后碰到类似问题,就得心应手了。

这样就会带着想法写代码,不是不明不白的写。

恩恩
O(∩_∩)O谢谢,感谢无私的帮助。 --------------------编程问答-------------------- 编码63的字符是问号(?), 所以无论如何, 不应该出现63吧? 而你说别人写的软件发送消息。。。是63, 那这个“别人写的软件”理论上应该不Work吧?

这个音乐符号,无论是用 utf8、utf16还是utf32编码, 应该都没有63吧(未验证)? --------------------编程问答--------------------
引用 18 楼 todd_leftcode 的回复:
编码63的字符是问号(?), 所以无论如何, 不应该出现63吧? 而你说别人写的软件发送消息。。。是63, 那这个“别人写的软件”理论上应该不Work吧?

这个音乐符号,无论是用 utf8、utf16还是utf32编码, 应该都没有63吧(未验证)?

这个我也疑惑,spy++获取的就是63,可能是上面那位仁兄说的强类型原因 --------------------编程问答-------------------- 或者 spy++ 抓到了正确的字符,并将其转码至 gb2312 再显示。。。。

另外, gb18030编码里有这个字符, 如果需要, 应该使用 gb18030而不是gb2312 --------------------编程问答-------------------- 都说“猜”的习惯不好的,因为UTF8是不定长字符,可以是1~6个字节,但是计算机读取的时候应该一次性读取多少字节呢?当然要先标示一下了,这个就是个标示符而已,说明没完,后边还有。
所以看到这个打头,就是说明“下载的软件”采用UTF8编码,也就是我一开始建议楼主转UTF8原因。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,