我要把指定的消息发送到另一个窗体的某个控件里面,但是后面才明白这是DrectUI技术,所有控件都是画出来的,没有句柄。
于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~
windows软件编码技术API
于是我先模拟鼠标点击,接着用sendmessage发送WM_CHAR消息到接收窗体。
发送中英文都能实现,但是就是某些符号不行,比如,我发送一个音乐符号。在接收窗体里显示的就不对。
后面发现我程序里是用的2312编码后发送的。而GB2312里面没有这个符号,于是我换成了Unicode编码,但是还是接收错误,其他编码也一样,就困在这了。
但是。过了几天我在网上下了个软件,也是发送字符到另一个指定窗体,而这个软件就能把这个符号发过去。于是我就用spy++查看接收窗体的消息日志,分别用我的软件和网上下的软件发送这个符号。
BUT!看图,接收窗体接收的两个软件的WM_CHAR消息的字符都是一样的。但是网上下载的软件发送的音乐符号能显示,而我的就不能!!这是怎么个情况~~小弟困在这半个月了。求解决啊~~
windows软件编码技术API
Unicode 不光指字符,而是要换 SendMessageW。
2、改用Encoding.UTF8编码传递试试
3、使用软件是Spy++,装了.net都有的,在Visual Studio Tools文件夹下
for (int i = 0; i < bt.Length; i++)
{
SendMessage(yyMainHwnd, 0X102, bt[i], 0);}
UTF16 63 00
UTF8 63也就是说,Unicode 会多占 1个8位,你的问题应该是接受框将1个字符当作两个字符来读,这样就有问题了你可以尝试将传入的字符转成byte[]逐一输出,你就可以看到差别了
1、Spy++捕获到了你发送的消息,说明再消息的收发上是没有问题了,这个就是直接给出第一条判断的原因;
2、消息能够正常送到,但是显示不正常,那怎么想也是编码的原因了吧?既然认定,为什么不坚持?
3、做外挂,对方不可能提前告诉你,他如何如何做,这些都是尝试的过程。
4、捕获传入的byte流,只是为了分析,你的程序和下载程序的区别,然后尝试消除区别。
5、如果你发送相同的消息,绝对不会产生不同的结果,这是原则中的原则,不要“感觉一样”,用事实说话吧。
行啊,只要有句柄就行
行啊,只要有句柄就行
句柄我获取到了,但是就是没法发送消息,这是我发的帖子,下边有代码,麻烦帮忙看下,谢谢.
http://bbs.csdn.net/topics/390564964
//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);
直到你后边贴代码,发现你没有用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。
Convert.ToInt32 是将字符转换为32位整型,因为C#是强类型语言,上边申明API时候:int wParam ,所以使用对应的类型。
你使用byte[],UTF8是可以的,但是要注意的是 1 byte = 8 bit 也就是只有8位,而
Unicode(UTF16)占用的是16位,也就是你1个字节是无法表示完整的Unicode的,这个时候就要用我们常说的双字节PS: 其实编码没有什么高深的,只是是否接触过而已比较推荐的方法是找本简单的汇编书看看,这样知识比较全面,而且会发现所有知识都可以串到一块。
以后碰到类似问题,就得心应手了。这样就会带着想法写代码,不是不明不白的写。
所以看到这个打头,就是说明“下载的软件”采用UTF8编码,也就是我一开始建议楼主转UTF8原因。