请问WIN2000下IME是怎么向RichTextBox发送字符的?或者说2000下怎么拦截RichTextBox的WM_IME_CHAR消息?

ASPBIT 2002-12-27 11:29:54
只要能解决问题分不够再加!!!

我用M$上的代码(http://support.microsoft.com/default.aspx?scid=kb;EN-US;168795)监测RichTextBox的事件,在输入中文的时候没有看到WM_IME_CHAR消息,WM_IME_CHAR=646.

怎么才能截获RichTextBox的WM_IME_CHAR消息,或者说怎么拦截中文输入.
我拦截的目的是要知道在RichTextBox的内容还没改变之前输入了什么字符.
我已经知道RichTextBox在Win2000下输入中文不触发KeyPress事件(如果有办法让他触发我很感谢,WIN98下可以触发KeyPress事件)

注意 注意 注意 ------- 所有的问题是在WIN2000上(98上可能没有这个问题)
注意 注意 注意 ------- 所有的问题是在WIN2000上(98上可能没有这个问题)
注意 注意 注意 ------- 所有的问题是在WIN2000上(98上可能没有这个问题)

我的开发环境:
Win2000AD中文版 + SP2
VB6中文企业版 + SP5
...全文
101 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ASPBIT 2003-01-20
  • 打赏
  • 举报
回复
问题没解决!!!!那个附件的WindowProc不能取得RICHTEXTBOX选择的文本(总是为"")


回复shawls(VB Fan)
呵呵
M$论坛上的Matrix就是我
__________________________________________

回复YHeng(我来也!!!!!!)
确实是做多无限撤消(要考虑RAM消耗)

shawls 2003-01-03
  • 打赏
  • 举报
回复
修改:

应该是lparam=2048
shawls 2003-01-03
  • 打赏
  • 举报
回复
找到了

Function WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_IME_COMPOSITION
' 处理WM_IME_COMPOSITION消息
If lParam > 2048 Then
Debug.Print "输入了汉字"
End If
End Select
WindowProc = CallWindowProc(lpPrevWndProc, hw, _
uMsg, wParam, lParam)
End Function
shawls 2003-01-03
  • 打赏
  • 举报
回复
这个是在ms的news上的帖子
转贴过来
附件我有,发信向我要--shawfile@163.net或者自己去msnews-cn

  偶不知道你是否已经解决这个问题了,但是偶愿意把偶的探索跟大家分享一下。
  在说之前,为了免Matrix着急,偶的代码在附件中,你可以先看它。
  刚开始偶的想法很简单,找到相关的IME消息,把它HOOK,然后处理之,很快的,
我找到了WM_IME_CHAR消息[1],在这个消息的解释中“A window receives this
message through its WindowProc function. ”,简直是天助我也,这是标准
SUBCLASS技术可以大展拳脚的地方,在[2]中你可以看到详细的解释,好了,从[3]中把
程序拷出来,把gHW = Me.hwnd改成gHW = RichTextBox1.hwnd,让这个HOOK程序拦截所
有发往RichTextBox1的消息,可是立即偶就失望了,它无论如何也无法拦截到这个消
息,看来问题不象偶想的那么简单,这是为什么呢,偶开始了艰难的探索过程。
  首先我分析了TEXT框和RichtextBox控件的WindowsClass差异,看看是什么原因使
得RichtextBox无法获得WM_IME_CHAR消息,结果发现在style和cbWndExtra2这两个有差
异,text的style是11,而RichtextBox是一个非常大的数,另外cbWndExtra2,text是8
而Richtextbox是4,就是这个数,在IME的说明中,要求这个必须是2*long才能获得
WM_IME_CHAR消息,这大概就是为什么richtextbox不能获得WM_IME_CHAR消息的原因了
(还有一个可能是在richtextbox派发消息时忽略了这个消息),但是偶试了很多办法
都没办法拦截到对这个函数的调用,也许SetWindowsHookEx可以做到,但是偶已经没有
耐心试验下去了,在[5]中已经提到了“用WM_IME_CHAR及WM_CHAR但此種作法不是一個
良好的方法,而且在雙位元版時會有一些問題出現”,所以偶想这其中可能真的有些问
题,就改变了方向,有兴趣的人可以继续朝这个方向走下去,如果走对了,说不定可以
满足Matrix要求,就是让KEYPRESS中获得WM_IME_CHAR消息。
  在偶最开始的程序中,偶发现可以捕获到的IME消息有WM_IME_SETCONTEXT、
WM_IME_STARTCOMPOSITION、WM_IME_NOTIFY、WM_IME_COMPOSITION、
WM_IME_ENDCOMPOSITION,这里面WM_IME_COMPOSITION是在CHANGE事件之前发生的,根
据[7]中的描述,当获得这个消息后,可以通过IME的函数获得用户已经选取的汉字,在
[8]中偶找到了在什么情况下表示用户已经完成了选取汉字,也就是当lparam包含了
GCS_RESULTSTR时就是用户已经完成了选字的过程,最后偶太懒了,就从[9]里面获得了
得到IME窗体选择的字体的VB函数,最后就形成了偶在附件中的代码。
  做为最后,偶想多说几句,参加这个论坛,大家基本上都是业余性质的,所以不要
对得到满意的答案报很大的期望,大多数的问题偶一般都只会给一个大致的思路,而不
会给出代码的具体描述,偶这里的过程其实每个人都能自己搞定,而且自己解决问题的
过程也是提高的过程,“自己构建”是每个VB程序员都应该追求的目标,在这一年的最
后一天,和大家共勉,祝大家新年好。


1、WM_IME_CHAR:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/ime_1d
iq.asp
2、About Window Procedures:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/win
dowing/windowprocedures/aboutwindowprocedures.asp
3、HOWTO: Hook Into a Window's Messages Using AddressOf:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;168795
4、WindowProc Function:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/win
dowing/windowprocedures/windowprocedurereference/windowprocedurefunctions/wi
ndowproc.asp
5、DX下VC6.0中文輸入問題:http://www.hoversoft.net/devinfo/0201doc/27vc6dx/
6、输入法简介:http://www.csdn.net/develop/Read_Article.asp?Id=15556
7、IME of MS-Windows:http://home.catv.ne.jp/pp/ginoue/im/win32-e.html
8、汉字输入法软件设计技术:http://wwsys.51.net/start.htm
9、如何取得或設定輸入時出現字根/注音符號的window內的字串:
http://www.hosp.ncku.edu.tw/~cww/html/q00462.html
__________________________________________________________________ wang tao
ICQ#: 51742738 Current ICQ status: + More ways to contact me
__________________________________________________________________


YHeng 2003-01-03
  • 打赏
  • 举报
回复
是不是想做多步撤销功能!
学习!!!!!!
litsnake1 2003-01-02
  • 打赏
  • 举报
回复
哦,明白了,
我还没试过hook消息的做法,但是如果你的要求不是很高的话,你可以试一下这个:
Private Sub RichTextBox1_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode > 128 Then
KeyCode = 0
End If
End Sub
刚才我是试过,可以不让输入中文,不知道能不能满足你的要求
ASPBIT 2002-12-31
  • 打赏
  • 举报
回复
回复 litsnake1
change事件太晚了
ASPBIT 2002-12-30
  • 打赏
  • 举报
回复
晕~~~~~~~~~~~~没人会???????????????????
litsnake1 2002-12-30
  • 打赏
  • 举报
回复
用change事件可以吗
litsnake1 2002-12-30
  • 打赏
  • 举报
回复
up
ASPBIT 2002-12-28
  • 打赏
  • 举报
回复
晕~~~~~~~~~~~~没人会???????????????????

那个M$的中文论坛也是这个样
给我不疼不痒的回答:2000,98的处理机制不一样

谁不知道处理机制不一样
我要的是解决问题的办法
NowCan 2002-12-27
  • 打赏
  • 举报
回复
的确很怪,我也做过钩子,但是RichEdit就是没有这个消息,而记事本却有。

遗憾,帮不了你。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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