中文输入遇到的问题

baoyz 2012-12-05 04:20:41

最近做一程序,就是向EDIT或RICHEDIT中输入中文
遇到一些问题。
用以下代码

char* str ="啊";
char t,e;
t = *(str);
e = *(str+1);

m_richedit.SendMessage(WM_IME_CHAR, (WPARAM)(t & 0xff), 0x00); //向RICHEDIT中输入中文
m_richedit.SendMessage(WM_IME_CHAR, (WPARAM)(e & 0xff), 0x00);

m_E1.SendMessage(WM_IME_CHAR, (WPARAM)(t & 0xff), 0x00); //向EDIT中输入中文
m_E1.SendMessage(WM_IME_CHAR, (WPARAM)(e & 0xff), 0x00);

结果edit中正常显示“啊”,richedit中显示乱码“°?”(0xA1 E3 3F)改字后,乱码跟着变。奇怪的是输入了2

个字符,出来了3个乱码。

把richedit升级到2.0

(1) 增加一全局变量 HMODULE hMod;
(2) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
(3) 在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to

"RichEdit20a".
(4) 在对话框头文件添加 CRichEditCtrl m_richedit;
在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);

后问题依旧。已确认hMod = LoadLibrary(_T("riched20.dll"));成功。

问为什么会这样???


另外问一下。
网上有很多人都转载一个用SENDINPUT输入中文的例子。搜“在VC中使用SendInput函数实现中文的自动输入”
像http://xylvhp.blog.163.com/blog/static/31123614201101104644542/这个网站就是一例。
我用了一下完全没效果。没有任何输出。即使只输出一个‘A’字符也不行。

#include <winable.h>
#include <atlconv.h>

char data = 'A';
INPUT input[2] = {0};
memset(input, 0, sizeof(input));

input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = data;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = data;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, input, sizeof(INPUT));


请大家帮我看看,哪写错了?编译通过,完全没效果。
...全文
149 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoyz 2012-12-13
  • 打赏
  • 举报
回复
问题始终没有解决,不过我改了方法,使用剪贴板向RICHEDIT里面贴字。 这是给妈妈做的一个“日记输入器”,她不会用拼音打字。
BlackGhost 2012-12-06
  • 打赏
  • 举报
回复

char* str ="啊";
WORD c=(*str)<<8 | *(str+1)

m_richedit.SendMessage(WM_IME_CHAR, (WPARAM)(c), lparam); //向RICHEDIT中输入中文

我认为是这样的 不知道对不对,也可能与lparam有关
y_keven 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 baoyz 的回复:
引用 5 楼 tianyazaiheruan 的回复:飘过。。不知道java跟c++通用不。。不过给你个案例你可以找找启发:http://blog.csdn.net/tianyazaiheruan/article/details/8112755 谢谢,我对java没什么了解。您给的例子我一句都没看懂。
这个。。最开始接触过c++,现在主攻的java。对c++的语法记得不太清了,你让我举例立马也想不上来。。
baoyz 2012-12-06
  • 打赏
  • 举报
回复
引用 5 楼 tianyazaiheruan 的回复:
飘过。。不知道java跟c++通用不。。不过给你个案例你可以找找启发:http://blog.csdn.net/tianyazaiheruan/article/details/8112755
谢谢,我对java没什么了解。您给的例子我一句都没看懂。
baoyz 2012-12-06
  • 打赏
  • 举报
回复
引用 1 楼 hzy694358 的回复:
是不是Richedit有什么属性要设置 或者改成UNICODE看看呢 还有为什么不直接setwindowtext?
我是要做一个文本编辑器,也就是在不固定的位置随时添字删字,如果用了setwindowtext只能把所有的字都编好一次性输出了。
y_keven 2012-12-05
  • 打赏
  • 举报
回复
飘过。。不知道java跟c++通用不。。不过给你个案例你可以找找启发:http://blog.csdn.net/tianyazaiheruan/article/details/8112755
傻X 2012-12-05
  • 打赏
  • 举报
回复
input[0].ki.wVk = data; 这个data要参考虚拟键值表的。 你看看正确与否。
zhouganghao 2012-12-05
  • 打赏
  • 举报
回复
估计要用UNICODE
Eleven 2012-12-05
  • 打赏
  • 举报
回复
你直接SendMessage(HWND, WM_SETTEXT,...);不行吗?
hzy694358 2012-12-05
  • 打赏
  • 举报
回复
是不是Richedit有什么属性要设置 或者改成UNICODE看看呢 还有为什么不直接setwindowtext?

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧