• 11178阅读
  • 10回复

[提问]在Qt中调用Win32API,给其他程序的Edit控件发送WM_SETTEXT消息,出现乱码[急需帮助!] [复制链接]

上一主题 下一主题
离线luckyyoung
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-12
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
我编写的程序需要使用WIN32API给其他窗口发送消息。
我在main()里添加了:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
这样就支持中文了。
然后用如下语句,将QString转换为char*:
QByteArray t1=filePath.toLocal8Bit();
char *_filePath=t1.data();
qDebug()<<"char* _filePath: "<<_filePath<<endl;//运行时,在QtCreator的application output中显示的_filePath是正确的中文字符。
可是当我调用::SendMessage(childHWND_ComboBoxEx32,WM_SETTEXT,0,(LPARAM)_filePath);给ComboBoxEx32控件发送消息时,控件中得到的就是乱码
我在VC中测试过,ComboBoxEx32中得到的是正确的中文字符。
可是在Qt中怎么都不行,郁闷了好久。请求帮助!!!
Anything is possible!
离线dbzhang800

只看该作者 1楼 发表于: 2011-10-12
首先,你应该确定你在调用
SendMessageA
还是
SendMessageW

其次,你应该去确定你的 _filePath 需要宽字符还是窄字符。

概念搞清,问题自然就解决了
离线luckyyoung

只看该作者 2楼 发表于: 2011-10-12
回 1楼(dbzhang800) 的帖子
我是给windows中的“打开”文件的ComboBoxEx32发送消息,是宽字符还是窄字符?能说得清楚点吗?谢谢!
Anything is possible!
离线luckyyoung

只看该作者 3楼 发表于: 2011-10-12
回 1楼(dbzhang800) 的帖子
真是太感谢了!果然,我把SendMessage改为SendMessageA就成功了!郁闷了好久的问题终于解决啦!
Anything is possible!
离线roywillow

只看该作者 4楼 发表于: 2011-10-12
因为local的codec你已经设置成了gb2312,然后path又转换成了local8bit,这个时候的字符串应该不是宽字符串了吧,所以要调用A而不是W
应该可以这么理解吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 5楼 发表于: 2011-10-12
引用第4楼roywillow于2011-10-12 22:18发表的  :
因为local的codec你已经设置成了gb2312,然后path又转换成了local8bit,这个时候的字符串应该不是宽字符串了吧,所以要调用A而不是W
应该可以这么理解吧

恩,是这样样子。不过他这个暴露的问题还是挺多的。

首先:
设置local的codec几乎总是一个不好的选择,除非只想程序在某个固定平台下使用。

其次:
我们知道,QString采用的utf16,Windows内部也是utf16,所以更合理的选择是直接使用W,而不需要在Qt中转成字节流,再由windows再将字节流转成utf16.

离线luckyyoung

只看该作者 6楼 发表于: 2011-10-15
回 4楼(roywillow) 的帖子
原来如此!
Anything is possible!
离线luckyyoung

只看该作者 7楼 发表于: 2011-10-15
回 5楼(dbzhang800) 的帖子
谢谢4楼(roywillow) 、5楼(dbzhang800 )的两位呀!每次对Qt的编码问题都比较晕,总是上网到处找方法。基本每次都它都会给我弄个乱码出来现现。两位有没有什么好的关于Qt编码的文章推荐我看看?目前网上的好多文章都没说清楚机理呀,让我乱试一通,耗时又费力~~~
Anything is possible!
离线roywillow

只看该作者 8楼 发表于: 2011-10-15
回 7楼(luckyyoung) 的帖子
其实我也只是一知半解,都是零零碎碎了解的一些东西……
编码这东西除非万不得已尽量少碰,这是我的感受……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 9楼 发表于: 2011-10-15
Re:回 5楼(dbzhang800) 的帖子
引用第7楼luckyyoung于2011-10-15 13:15发表的 回 5楼(dbzhang800) 的帖子 :
谢谢4楼(roywillow) 、5楼(dbzhang800 )的两位呀!每次对Qt的编码问题都比较晕,总是上网到处找方法。基本每次都它都会给我弄个乱码出来现现。两位有没有什么好的关于Qt编码的文章推荐我看看?目前网上的好多文章都没说清楚机理呀,让我乱试一通,耗时又费力~~~

主要应该是你自己对编码的概念不清。只要概念清楚,无论是系统 api 中的 W/A 两类函数,Qt中QByteArray <==> QString 互相转换,C/C++ 中的wchar_t* 和 char* ,还是其他语言中的编码相关的问题,都是很简单。

说到底就是 字节流 和 unicode字符串的转换。

http://hi.baidu.com/cyclone/blog/item/d299af51e04aed868d543064.html
http://hi.baidu.com/cyclone/blog/item/9d7293130e5a498d6538dbf1.html
离线luckyyoung

只看该作者 10楼 发表于: 2011-10-16
回 9楼(dbzhang800) 的帖子
谢谢!哈哈,在网上逛到你的百度空间和CSDN了  
Anything is possible!
快速回复
限100 字节
 
上一个 下一个