WM_IME_CHAR和WM_CHAR将一个字符窜数组中的汉字和英文字符发送给某个窗口发送汉字失败

wdzhangsl 2008-03-29 01:46:39
我想用API中的SendMessage()函数实现上述功能,英文字符,可以输出,但是汉字不行啊,不知道怎么回事啊。
谁能给我个例子啊
我自己写的代码
char talk[100];
GetPrivateProfileString("talk","message",NULL,talk,100,".\\peizhi.ini");
for(i=0;talk[i]!=0;i++)
{
if(talk[i]<128)//如果是英文字符的话
PostMessage(hwnd_rxjh,WM_CHAR,talk[i], 0);
if(talk[i]>=128)//如果是汉字的话
{
c = (BYTE)talk[i];
WPARAM c = (c<<8) | (BYTE)talk[i+1];
SendMessage(hwnd_rxjh,WM_IME_CHAR,c,0);
i++;

}
}
}
...全文
269 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-03-30
  • 打赏
  • 举报
回复
消息的lParam不能是0。
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; //窗口句柄 message: UINT;//消息常量标识符 wParam: WPARAM ;// 32位消息的特定附加信息 lParam: LPARAM ;// 32位消息的特定附加信息 time: DWORD;//消息创建时的时间 pt: TPoint; //消息创建时的鼠标位置 end ; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可 视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也 可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。 WM_NULL =$0000 // WM_CREATE =$0001 //应用程序创建一个窗口 WM_DESTROY = $0002 //一个窗口被销毁 WM_MOVE = $0003 //移动一个窗口 WM_SIZE= $0005 //改变一个窗口的大小 WM_ACTIVATE= $0006 //一个窗口被激活或失去激活状态; WM_SETFOCUS= $0007 //获得焦点后 WM_KILLFOCUS= $0008 //失去焦点 WM_ENABLE= $000A //改变enable状态 WM_SETREDRAW= $000B //设置窗口是否能重画 WM_SETTEXT= $000C //应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = $000D //应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = $000E //得到与一个窗口有关的文本的长度(不包含空字符WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = $0013 //当用户窗口恢复以前的大小位置时,把此消息发送某个图标 WM_ERASEBKGND = $0014 //当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = $0015 //当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = $0016 // 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送应用程序,通知它对话是否结束 WM_SYSTEMERROR = $0017 // WM_SHOWWINDOW= $0018 //当隐藏或显示窗口发送此消息给这个窗口 WM_ACTIVATEAPP = $001C //发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE= $001D //当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE= $001E //当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE= $001F //发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = $0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = $0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = $0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC= $0023 //此消息由基
Product Name : NT Locale Emulator Advance (NT全域通) short for NTLEA Component Description: ntlea.exe - NTLEA GUI shell and shortcut launcher ntleac.exe - NTLEA core launcher ntleah.dll - NTLEA remote injection DLL ntleap.dll - NTLEA helper library neko.dll - NTLEA GUI runtime library Version & Update History : NTLEA Core 0.86 Beta 07.6.13 by LOVEHINA-AVC 增加对GetSystemDefaultUILanguage及GetUserDefaultUILanguage函数的挂钩 改善了Computer-based Training钩子的挂钩方式 修正了其他一些细小的BUG NTLEA Core 0.85 Beta 07.6.9 by LOVEHINA-AVC 增加让NTLEA加载的应用程序不受系统SDB补丁机制影响的功能 修正了其他一些细小的BUG NTLEA Core 0.83 Beta 07.6.8 by LOVEHINA-AVC 修正了之前的版本不能让含有特殊字符路径的应用程序正常工作的问题 修正了其他一些细小的BUG NTLEA GUI Launcher 1.0 Final 07.6.7 by 七夜真神 增加多语系界面支持与对应的区码(目前支持简体中文、繁体中文及英文) NTLEA Core 0.82 Beta 07.6.7 by LOVEHINA-AVC 修正了在一部分程序下执行会发生初始化失败的问题 完善了跨进程跟踪注入的功能 增加直接打开任意扩展名文件的功能(注:若系统中启用了Microsoft Applocale,msi安装程序将无法被NTLEA正确加载) 0.80 beta 07.6.4 中文名称更改为“NT全域通” 修正了对话框处理函数不能被正确挂钩的问题 修正了因错误地址传递导致应用程序启动失败的问题 修正了一部分程序不能使用IME标准输入法的问题 修正了0.72~0.75版不能在Windows 2000及Windows XP SP0 SP1下运行的问题 增加WM_CHARWM_IME_CHAR消息的处理模块,修正了输入框文字不能被正确显示及文字不能被正确输入的问题 消除了数个读零地址非法操作的诱发因素 改进了消息钩子的处理方式 增加应用程序参数指定的支持(详见命令行选项说明) 增加重新指定字体大小的功能(详见命令行选项说明) 修正了Core Launcher(NTLEAC)不能引导一部分程序的问题 修正了多个细小的BUG 0.75 beta 07.1.10 修正了0.73版不能支持某些Unicode/ANSI混合型应用程序的问题 ntleac命令行模式“F”选项实装(注:若要强制指定应用程序所使用的字体,则至少需追加“P4”选项) 增加LB_GETTEXTLEN消息的处理模块(感谢Yoxola提供兼容性问题报告) 0.73 beta 06.12.16 修正了一部分程序在通过系统模版创建窗口时无法被正确挂钩的问题 0.72 beta 06.12.4 修正了在Visual C++ MFC框架程序中会产生乱码的兼容性问题 修正了在调用对话框模版函数后程序运行不正常的问题 增加对kernel32!CreateProcessW函数的挂勾 0.70 beta 06.11.30 增加以下针对窗口及消息处理函数的挂钩: user32!SetWindowTextA user32!GetWindowTextA user32!SendMessageA user32!SendMessageTimeoutA user32!SendMessageCallbackA user32!SendNotifyMessageA user32!PostMessageA user32!GetWindowLongA user32!SetWindowLongA user32!DefDlgProcA user32!DefFrameProcA user32!DefMDIChildProcA user32!DialogBoxParamA user32!DialogBoxIndirectParamA user32!CreateDialogParamA user32!CreateDialogIndirectParamA 增加其它的一些函数的挂钩: user32!GetMenuStringA user32!GetMenuItemInfoA user32!SetMenuItemInfoA kernel32!CharPrevA kernel32!CharNextA kernel32!IsDBCSLeadByte gdi32!EnumFontFamiliesExA gdi32!CreateFontIndirectA 增加自定义右键启动菜单的功能 增加指定预设字体的功能 0.52 beta 06.10.14 增加对user32!CreateWindowExA函数的挂钩 增加对user32!DefWindowProcA函数的挂钩 修正了VerQueryValueA挂钩函数在Windows XP SP0及SP1下会导致无效内存访问异常的问题 0.50 beta 06.10.12 增加对kernel32!GetCommandLineA函数的挂钩 修正了ntdll!RtlUnicodeToMultibyteN挂钩函数中一个重大的BUG,解决了大部分程序的兼容性问题 0.20 beta 06.10.9 增加针对特定应用程序的支持选项 重写部分函数,提高了挂勾程序的兼容性 修正数个小BUG 0.17 beta 06.9.30 再次(?)完善了kernel32!CreateProcessA挂钩函数的功能 0.16 beta 06.9.28 修正在目标程序调用version!VerQueryValueA时可能构成死循环的BUG 0.15 beta 06.9.27 增加对kernel32!GetTimeZoneInformation函数的挂钩,新增时区修正参数 增加对version!VerQueryValueA函数的挂勾 增加对Windows XP SP0操作系统的支持 新增一个兼容性选项 去除了不必要的语言ID参数 完善了kernel32!CreateProcessA挂钩函数的功能 0.11 beta 06.9.25 启动程序ntleac.exe与挂钩程序ntleah.dll由ANSI版本转变为Unicode版 注:如果在使用NTLEA外壳时发现程序无法启动,可尝试直接运行ntleac.exe 附:ntleac参数说明(第一个参数必须包含双引号): 1. "x:\xxxxx\xxx.exe" 说明:目标程序路径。该参数必须位于第一项。 2. "Px" 说明:指定兼容性选项。x为描述兼容性开关的数值,每一个位域指定一个选项(注)。例如,当x为1时,第1个兼容性选项将被开启;当x为8时,第4个兼容性选将被开启;当x为7时,前3个兼容性选项均被开启(1 | 2 | 4 = 7)。 注:这里所说的位域是指二进制数的数位,一个整数最多拥有32个位域,第x位域的值等于2的x次方。 3. "Cx" 说明:指定页码。x为页码ID。 4. "Lx" 说明:指定语言。x为语言区域ID。 5. "Tx" 说明:指定时区修正。x为UTC时区修正数值,单位是分钟。 6. "Fxxx" 说明:指定预设字体,xxx为字体名称。 7. "Axxx" 说明:指定将要传给目标应用程序的参数,xxx为参数内容。 8. "Sx" 说明:指定字体的收放比率,x为比值,单位是百分率。 示例: ntleac.exe "d:\test\game.exe" "A-G 123 -B 456" "P0" "C932" "L1041" "T-540" "FMS Gothic" "S200" 执行结果为启动“d:\test\game.exe -G 123 -B 456”,并设置页码为932(日文Shift-JIS),语言区域为日本,字体为“MS Gothic”,以两倍的大小显示,时区为东9区(GMT + 9:00或UTC - 9:00)。 (注:如果参数中包含双引号,则可用单引号来代替。如上例的"A-G 123 -B 456",追加双引号后可书写为"A'-G 123' '-B 456'") 0.10 beta 06.9.25 正式更名为NT Locale Emulator Advance 增加具有图形界面的外壳程序 增加跨进程跟踪功能 0.05 beta 06.9.24 修正了0.04 beta无法在Windows 2000及XP SP1下运行的问题 0.04 beta 06.9.24 增加对kernel32!CompareStringA函数的挂钩 增加对ntdll!RtlUnicodeToMultibyteN函数的挂钩 0.03 beta 06.9.24 增加对kernel32!CreateFileA函数的本地化支持 修正了前一个版本在多处理器系统中可能出现的兼容性问题 0.02 beta 06.9.23 修正了无法在Windows XP SP1下运行的问题 0.01 beta 06.9.22 最初的版本 FAQs Q:这个工具能够做什么? A:区域模拟,以及内码转换。一些应用程序可能无法在其它的区域模拟软件下正常运行,因此我编写了这个工具,以避免手工转换系统语言区域所带来的麻烦。 Q:它的兼容性如何? A:该程序能够在Windows 2000 SP4/XP及2003 SP1下正常工作,但它很可能不支持Windows 2000 SP3及更低的版本。(注意,当前的版本不支持Windows 20003 Gold、即SP0) 目前已测试可以支持的操作系统详细列表: Windows 2000 SP4 Windows XP Windows XP SP1 Windows XP SP2 Windows Server 2003 SP1 Windows XP x64 Edition Windows Vista Q:使用这个工具时需要安装额外的软件吗? A:不需要。同时这个程序也是绿色软件。 Q:我看到了两个可执行文件,应该怎样使用它们? A:直接运行ntleac.exe,或者为它建立一个快捷方式,并在命令行的末尾填上目标程序的全路径名。关于参数的详细说明请参考附录,在新的版本中您还可以使用名为NTLEAGUI的外壳程序。 Q:我可以与他人分享这个软件吗? A:是的,您可以自由转载这个程序,但请务必保持其完整,且不要修改任何内容。

16,472

社区成员

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

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

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