32位输入法向64位移植的问题

screen12 2014-09-11 02:39:41
我有一个32位的输入法,安装在win7 64位系统下,发现只能用于32位应用程序。

于是想把32位输入法移植到64位上,然后生成两个同名输入法,一个是32位的,一个是64位的,32位的放在c:\windows\syswow64\下,64位的放在c:\windows\system32下。然后当你打开的是32位程序,系统就自动选32位的输入法,你打开的是64位程序,系统会自动选择64位的输入法。

我有一些疑问,就是两个输入法分别对应32位程序和64位程序,这个我知道,但是安装程序应该是32位的还是64位的呢?而且安装的时候,需要注册,注册是用ImmInstallIME这个函数来注册的。那么安装程序应该是32位还是64位?用ImmInstallIME注册的时候,里面要填你的ime文件位置,这时填的是32位的ime文件的位置?还是64位的ime文件的位置?

我现在用的安装程序是32位的,注册的时候,填的是这个文件c:\windows\system32\zywb.ime,不过这个路径会不会被自动改成c:\windows\syswow64\zywb.ime?

反正我是这样安装了,最后把64位的输入法和32位的输入法分别放到那两个目录中,然后发现32位的输入法工作正常,就是打开32位程序,选择该输入法,可以正常工作。但是打开64位程序,选择该输入法,却工作不正常。

我于是调试,调试的是64位的输入法,在里面加入一条MessageBox语句,我发现:当你按ctrl +F5 执行的时候(这时当然会启动它的宿主——应用程序),这时,那条MessageBox语句没有被执行,说明它嵌入的是32位的输入法(真奇怪,64位的应用程序竟然也能使用32位的输入法),但是你按F5调试的时候,这时那条MessageBox会被执行,说明它使用的是真正的64位输入法,此时工作不正常。

不正常的表现在于:当ImeToAsciiEx函数最后发送消息时,我也和32位一样,在消息缓冲区里填写好,并返回消息的个数。但是UI窗口却收不到。所以候选窗口总是显示不出来。但是,当我把应用程序窗口最小化,再还原时,由于UI窗口能收到一个WM_IME_SETCONTEXT消息,这个消息会显示窗口,我发现,应用程序窗口最小化再还原以后,输入法的候选窗口显示出来了,显示的内容也正确。也就是说:其他一切功能正常。就是在ImeToAsciiEx填写的消息,UI窗口收不到。

请问是怎么回事?
...全文
1025 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37466598 2017-02-07
  • 打赏
  • 举报
回复
多谢a617622010, 刚才不知为什么只看到2014年的贴.
qq_37466598 2017-02-07
  • 打赏
  • 举报
回复
我遇到相同问题, 能不能说一下另一种方法?
abcjingtong 2016-09-30
  • 打赏
  • 举报
回复
另外补充:关于32位程序转64位,大家可以看 http://blog.csdn.net/hpjx1987/article/details/51453586 虽然是delphi的,但是很参考价值,我猜测发消息楼主换的另一种方法是由 SendMessage(hWnd, WM_SETTEXT, 0, Integer(@MyCharArray)); 换为 SendMessage(hWnd, WM_SETTEXT, 0, LPARAM(@MyCharArray));
abcjingtong 2016-09-30
  • 打赏
  • 举报
回复
中国的技术员就是这样,他有问题的时候,希望全世界都来为他想办法出招解决,他解决后从来不说是怎么解决的,就像楼主一样,你在3楼说查到的资料中只说换了种方式就好了,但没有告诉你换哪种方式,你很着急想知道是哪种方式,但楼主,你恶心就恶心在你在6楼说你解决了,解决办法是发送消息换另一种方式就行了。 你没发现同样的情事也出在你身上了吗,你解决了也不告诉我们换哪种方式,所以我在这里发贴喷你,你别不乐意,虚心接受吧!
sayyoume8220202 2016-09-06
  • 打赏
  • 举报
回复
怎么解决的?
qq_15539939 2016-07-06
  • 打赏
  • 举报
回复
大神,我现在也遇到这个问题,求解释啊
e我行 2016-04-18
  • 打赏
  • 举报
回复
请教一下,你是如何解决的呢?“发送消息换另一种方式就行了。”这个是指用什么方式发消息呢?
billypeng06 2016-04-14
  • 打赏
  • 举报
回复
解决了问题,都是生怕别人知道似的,再也不肯透露一点消息。
Saleayas 2014-09-12
  • 打赏
  • 举报
回复
我在看 DirectX 中的输入法的时候,看到的。我不是很确定。
Saleayas 2014-09-12
  • 打赏
  • 举报
回复
好像必须使用 IsWindowUnicode 判断 ? 这是在 注册窗口的时候确定的。 ANSI 和 Unicode 在接受字符的时候是不一致的。WM_IME_CHAR 和 WM_CHAR.
screen12 2014-09-12
  • 打赏
  • 举报
回复
引用 4 楼 Saleayas 的回复:
好像必须使用 IsWindowUnicode 判断 ? 这是在 注册窗口的时候确定的。 ANSI 和 Unicode 在接受字符的时候是不一致的。WM_IME_CHAR 和 WM_CHAR.
问题已解决。64位程序不一定需要用unicode注册窗口。发送消息换另一种方式就行了。
screen12 2014-09-11
  • 打赏
  • 举报
回复
64位的输入法,是不是一定要使用Unicode字符集?使用Ansi字符集行不行?我的就是Ansi字符集。
screen12 2014-09-11
  • 打赏
  • 举报
回复
我的问题可能是这位网友在贴子中所讲的:http://blog.csdn.net/tujiaw/article/details/6233003 他说“当然输入法里还有一些其它的问题, 我就遇到过在32位下发消息的方式没问题, 在64位下就不行。还好本来就有两种方式, 我换了种方式就好了。”。 可是他没说换了一种方式是什么方式。不知有人能帮我联系一下这位网友吗?他的ID是:tujiaw 有时候遇到技术问题真头疼啊!跟大海捞针一样的找原因。
Saleayas 2014-09-11
  • 打赏
  • 举报
回复
都是 System32 这个目录。 当你的 32 位程序运行于 64 位系统的 WOW 的时候,会自动重定向到 SysWow64 目录。

16,471

社区成员

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

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

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