中文输入法,是借助西文键盘和特定编码生成汉字编码的方法。中文输入法好像“劫道”的,它拦截键盘传递给系统的消息,将其转换为汉字编码后,将其作为消息传到你的文本框控件。因此,无论是从文本框接收到的消息,还是文本框自身的状态,都无法得知插在中间的是哪一位“好汉”。有关输入法的信息,只能通过操作系统来获得。首先用下面的 API 函数获取一个句柄(dwLayout = 0): Public Declare Function GetKeyboardLayout Lib "user32" Alias "GetKeyboardLayout" (ByVal dwLayout As Long) As Long然后,将所得的句柄送入下面函数的 hkl 参数获取输入法名称。lpsz 是字符串缓存,uBufLen 是长度,可设为 255。 Public Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As Long但未必所有输入法都能得到一个文字名称。此时,可以借助查表法通过 hkl 句柄得到获知当前输入法。 E0010804 全拼输入法 5.0 版 E0040804 智能ABC输入法 5.0 版 E0050804 区位输入法 5.0 版 E0100804 王码五笔型输入法 86 版 E0110804 王码五笔型输入法 98 版 E0200804 紫光拼音输入法3.0 08040804 微软拼音2003 04040404 [台湾]微软注音输入法 08090809 英语
Option Explicit Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As LongPrivate Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As LongDim list1 As Variant, list2 As VariantPrivate Sub Command1_Click() Dim ret As Long, hkl As Long, i As Long Dim strTmp As String hkl = GetKeyboardLayout(0) strTmp = Space(255)
ret = ImmGetDescription(hkl, strTmp, 255)
strTmp = Trim(strTmp) If strTmp > "" Then Text1 = strTmp Else For i = 0 To UBound(list1) If hkl = list1(i) Then strTmp = list2(i) Next i
If strTmp > "" Then Text1 = strTmp Else Text1 = Right("00000000" & Hex(hkl), 8) End If End If End SubPrivate Sub Form_Load() list1 = Array(&H8040804, &H4040404, &H8090809, &H4090409) list2 = Array("微软拼音输入法2003", "微软注音输入法[台湾]", "英语[英]", "英语[美]") End Sub
http://www.itnose.net/detail/150092.html
http://blog.csdn.net/liuliu0103/article/details/6294564没空去试,你研究下
请版主能不能提供详细代码来研究研究,谢谢!
ImmGetDescription
?
Public Declare Function GetKeyboardLayout Lib "user32" Alias "GetKeyboardLayout" (ByVal dwLayout As Long) As Long然后,将所得的句柄送入下面函数的 hkl 参数获取输入法名称。lpsz 是字符串缓存,uBufLen 是长度,可设为 255。
Public Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As Long但未必所有输入法都能得到一个文字名称。此时,可以借助查表法通过 hkl 句柄得到获知当前输入法。
E0010804 全拼输入法 5.0 版
E0040804 智能ABC输入法 5.0 版
E0050804 区位输入法 5.0 版
E0100804 王码五笔型输入法 86 版
E0110804 王码五笔型输入法 98 版
E0200804 紫光拼音输入法3.0
08040804 微软拼音2003
04040404 [台湾]微软注音输入法
08090809 英语
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As LongPrivate Declare Function ImmGetDescription Lib "imm32.dll" Alias "ImmGetDescriptionA" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As LongDim list1 As Variant, list2 As VariantPrivate Sub Command1_Click()
Dim ret As Long, hkl As Long, i As Long
Dim strTmp As String hkl = GetKeyboardLayout(0)
strTmp = Space(255)
ret = ImmGetDescription(hkl, strTmp, 255)
strTmp = Trim(strTmp)
If strTmp > "" Then
Text1 = strTmp
Else
For i = 0 To UBound(list1)
If hkl = list1(i) Then strTmp = list2(i)
Next i
If strTmp > "" Then
Text1 = strTmp
Else
Text1 = Right("00000000" & Hex(hkl), 8)
End If
End If
End SubPrivate Sub Form_Load()
list1 = Array(&H8040804, &H4040404, &H8090809, &H4090409)
list2 = Array("微软拼音输入法2003", "微软注音输入法[台湾]", "英语[英]", "英语[美]")
End Sub