richedit怎么获取输入的宽字符

本文探讨了在非Unicode编程环境中如何正确获取窗口中的宽字符文本,特别是使用GetWindowTextW函数的方法,并解释了如何避免因系统编码转换导致的数据错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如上,用getdlgitemtext的话不是只能用CString和char * 吗,在非nuicode编程的情况下,有没有办法获取宽字符。

有没有GetDlgItemTextW函数?有的话,就用这个函数,如果没有的话,可以借助GetDlgItemText这个函数实现自己的GetDlgItemTextW函数。
 

应该是没有w这个函数的,但是如果你用普通字符去获取的话,假如我是日文系统下,它会转成日文的,就会把一些没字给转错了,你再转回来就是错的了。

我的意思呀,假如我当前的环境是日文系统,在非unicode工程下,你得到的数据是已经是错误的了,因为日语中不存在一些汉字,也就显示乱码的一部分汉字不存在,你再用转的话,由于源都是错的了,你再转出来的肯定也是错误的。

winuser.h里面定义的:
#ifdef UNICODE
#define GetWindowText GetWindowTextW
#else
#define GetWindowText GetWindowTextA
#endif

非unicode环境下也可以用GetWindowTextW,GetWindowTextW是从user32.dll输出的,内部都是unicode的,和你的工程环境没关系

你用GetWindowTextW试试先。

GetWindowTextW 的定义:

int
WINAPI
GetWindowTextW(
  __in HWND hWnd,
  __out_ecount(nMaxCount) LPWSTR lpString,
  __in int nMaxCount);

其中第2个参数就是UNICODE字符串变量。

不是吧, 我用这个也能吗 GetActiveWindow()->m_hWnd,获得应该是rich edit的句柄吧,rich edit也算一个窗口吧,可以我看了下,得出来的居然还是乱码,是系统经过转码了吗,就是你输入时转为unicode,他再获得时先转成当前环境再转成了unicode编码吗,要不怎么会还是乱码呢
你这个GetActiveWindow()->m_hWnd是由什么对象调用的啊,获得的不一定是rich edit的句柄。
你得用rich edit的窗口句柄调用GetWindowTextW。
可以用GetDlgItem得到rich edit的窗口句柄。

windows系统内部都是统一的unicode编码,也就是处理字符串的时候都是unicode的。当你的工程是unicode的时候,中间不会产生转换。当你的工程是非unicode的时候,系统和应用程序通信时会先进行转换。所以GetWindowTextW得到的是unicode字符,wchat_t类型就是用来存放unicode编码字符的。而GetWindowTextA内部其实也调用了GetWindowTextW,只不过内部做了转换。相当于:
GetWindowTextA(char* bufA,...)
{
  wchar_t bufW[];
  GetWindowTextW(bufW, ...);
  WideCharToMultiByte(bufA, bufW);//转换成ANSI的字符串
}

所以你直接
wchar_t bufW[];
GetWindowTextW(bufW, ...);
就行了。

我指的是,你字,在日文中是不存在的,你用日文输出得到是的是?号,但是在unicode中你是对应的是一个编号20230什么的,这块得出的直接是用日文内码对应的63,也就是它已经被转为了日文内码,不在是unicode编码了,也有可能是unicode编码,但是是错的了.

来源:英超直播

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值