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

解决方案 »

  1.   

    楼主功力深厚啊,懂 windows 消息机制的人不多了,捕获消息用的什么软件啊,貌似功能好强大!
    Unicode 不光指字符,而是要换 SendMessageW。
      

  2.   

    1、这个和消息收发没关系
    2、改用Encoding.UTF8编码传递试试
    3、使用软件是Spy++,装了.net都有的,在Visual Studio Tools文件夹下
      

  3.   

    不行啊。改成UTF8或者其他编码就收到的字符都变了
      

  4.   

    这是我的发送字符代码 byte[] bt = Encoding.Default.GetBytes(s);
    for (int i = 0; i < bt.Length; i++)
    {
         SendMessage(yyMainHwnd, 0X102, bt[i], 0);}
      

  5.   

    Unicode 其实是UTF16 ,基础码值和UTF8一样,多了一些字符而已内存中存储的方式:
    UTF16 63 00
    UTF8  63也就是说,Unicode 会多占 1个8位,你的问题应该是接受框将1个字符当作两个字符来读,这样就有问题了你可以尝试将传入的字符转成byte[]逐一输出,你就可以看到差别了
      

  6.   

    上面说了,接收窗体不是我写的,是另一个软件,我不知道他用什么编码读的,不过应该是GB2312,因为我按GB2312的编码发给它就能正确显示,但是GB不能发送音乐符号 啊 
      

  7.   

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

  8.   

    亲,你看我上面的那张图,两个软件发送符号后,接收窗体接收的charcode(这个就是你说的byte流吧)都是63,但就是显示的不同,我就不懂在这儿了。
      

  9.   

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

  10.   

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

  11.   

    亲,sendmessage能向后台进程发送消息吗?如何实现呢?程序最小化就不行了.
    行啊,只要有句柄就行
    句柄我获取到了,但是就是没法发送消息,这是我发的帖子,下边有代码,麻烦帮忙看下,谢谢.
    http://bbs.csdn.net/topics/390564964
      

  12.   

    刚刚断网,没发上
    //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);
      

  13.   

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

  14.   

    啊,终于弄出来了,灰常感谢!!!!!!
    以前就没用过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。
      

  15.   

    那个变量 s 是什么?是string?char[]?
    Convert.ToInt32 是将字符转换为32位整型,因为C#是强类型语言,上边申明API时候:int wParam ,所以使用对应的类型。
    你使用byte[],UTF8是可以的,但是要注意的是 1 byte = 8 bit 也就是只有8位,而
    Unicode(UTF16)占用的是16位,也就是你1个字节是无法表示完整的Unicode的,这个时候就要用我们常说的双字节PS: 其实编码没有什么高深的,只是是否接触过而已比较推荐的方法是找本简单的汇编书看看,这样知识比较全面,而且会发现所有知识都可以串到一块。
    以后碰到类似问题,就得心应手了。这样就会带着想法写代码,不是不明不白的写。
      

  16.   

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

  17.   

    这个我也疑惑,spy++获取的就是63,可能是上面那位仁兄说的强类型原因
      

  18.   

    或者 spy++ 抓到了正确的字符,并将其转码至 gb2312 再显示。另外, gb18030编码里有这个字符, 如果需要, 应该使用 gb18030而不是gb2312
      

  19.   

    都说“猜”的习惯不好的,因为UTF8是不定长字符,可以是1~6个字节,但是计算机读取的时候应该一次性读取多少字节呢?当然要先标示一下了,这个就是个标示符而已,说明没完,后边还有。
    所以看到这个打头,就是说明“下载的软件”采用UTF8编码,也就是我一开始建议楼主转UTF8原因。