用VB读取和控制Windows的中文输入法
在Windows中我们可以用“Ctrl+Shift”键来调入或切换中文输入法,但是这样做每次都是使位于输入法列表顶端的那个输入法首先被调用。通常我们都要连续按好几次“Ctrl+Shift”才能将习惯的输入法调出。我编制了一段小程序,通过它可以把任意一个输入法放在输入法列表的顶端。
它的原理是:使用LoadKeyboardLayout函数可以改变输入法的顺序,只要在第一个参数中传递目标输入法的KeyboardlayoutName,第二个参数用KLF_REORDER就可以了。
例如,aa = LoadKeyboardLayout(″00000409″, KLF_REORDER) 使英文变成第一。那怎样获得KeyboardlayoutName呢?因为使用GetKeyboardLayoutname可以返回当前输入法的KeyboardlayoutName,所以我们可以先用GetKeyboardLayoutList 函数来取得所有输入法,再用activateKeyboardlayout()函数设置当前输入法,最后就可以得到它的KeyboardlayoutName了。具体步骤如下:
打开VB后选择标准的EXE文档,在Form1上添加一个Combobox和一个command控件,输入以下程序。
′以下的API函数用于输入法操作
Private Declare Function GetKeyboardLayoutList Lib ″user32″ _
(ByVal nBuff As Long, lpList As Long) As Long
Private Declare Function ImmGetDescription Lib ″imm32.dll″ _
Alias ″ImmGetDescriptionA″ (ByVal hkl As Long, _
ByVal lpsz As String, ByVal uBufLen As Long) As Long
Private Declare Function ImmIsIME Lib ″imm32.dll″ (ByVal hkl As Long) As Long
Private Declare Function ActivateKeyboardLayout Lib ″user32″ _
(ByVal hkl As Long, ByVal flags As Long) As Long
Private Declare Function GetKeyboardLayout Lib ″user32″ (ByVal dwLayout As Long)As Long
Private Declare Function GetKeyboardLayoutName Lib ″user32″ Alias _
″GetKeyboardLayoutNameA″ (ByVal pwszKLID As String) As Long
Private Declare Function LoadKeyboardLayout Lib ″user32″ Alias ″LoadKeyboardLayoutA″ _
(ByVal pwszKLID As String, ByVal flags As Long) As Long
Const KLF_REORDER = &H8
Private NoOfKBDLayout As Long, i As Long, j As Long
Private hKB(24) As Long, BuffLen As Long
Private Buff As String
Private RetStr As String
Private RetCount As Long
Private kln As String
Private Sub Command1_Click()
If Combo1.ListIndex = -1 Then′如果用户尚未选择输入法,显示出错信息
MsgBox ″请先选择一个输入法″
Exit Sub
End If
′改变输入法顺序
kln = String(8, 0)
ActivateKeyboardLayout hKB(Combo1.ListIndex), 0
res = GetKeyboardLayoutName(kln)
res = LoadKeyboardLayout(kln, KLF_REORDER)
ActivateKeyboardLayout hCurKBDLayout, 0
End Sub
Private Sub Form_Load()
Buff = String(255, 0)
hCurKBDLayout = GetKeyboardLayout(0) ′取得目前的输入法
NoOfKBDLayout = GetKeyboardLayoutList(25, hKB(0)) ′取得所有输入法
′ReDim layoutlist(NoOfKBDLayout) As String
For i = 1 To NoOfKBDLayout
If ImmIsIME(hKB(i - 1)) = 1 Then ′中文输入法
BuffLen = 255
RetCount = ImmGetDescription(hKB(i - 1), Buff, BuffLen)
RetStr = Left(Buff, RetCount)
Combo1.AddItem RetStr
Else
RetStr = ″English (American)″ ′英文输入法
Combo1.AddItem RetStr
End If
Next
ActivateKeyboardLayout hCurKBDLayout, 0 ′恢复原来的输入法
End Sub
运行后,在combobox中选择目标输入法,按下command即可。。
解决方案 »
- 求各位大神帮忙MScomm,谢谢!!!!!!!!!!!!!!!!!
- 关于Inner jion的特殊问题
- 求助WebBrowser控件,怎样打开指定的网页。
- 如何实现随机 按钮??
- 请问VB怎样模拟鼠标双击功能
- 高手请进:ado控件调用存储过程的问题,急,在线等!
- vb3 怎样定义一个400K大小的字符串数组?
- 一两年断断续续完善,终于完成进销存系统,散分
- 另一个问题,我安装了win2000 和 office2000,而软件连接的是 Access97,现在连接不上了如何解决???
- 一个很简单的问题!!在线等待,请各位教我~~
- 怎样取得HTMLBody或HTMLDocumnet中的网页标签?
- ACCESS 2000 中的问题
如何自动更动成中文输入
如果使用的VB5.0则,查看有没有一个属性是IMEMode,如果有就设定为1 代表开启,那
便可以每次进入这个Control项时就切换成中文输入。如果没有,那只好自己做。'以下在.Bas
Public Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
Public Declare Function ImmIsIME Lib "imm32.dll" (ByVal hkl As Long) As Long
Public Declare Function ImmSimulateHotKey Lib "imm32.dll" (ByVal hwnd As Long, ByVal dw As Long) As Long
Const IME_THOTKEY_IME_NONIME_TOGGLE = &H70PuBlic Sub Chg2Chinese(ByVal hwnd As Long) '传入Control项或Form 的hwnd
Dim hkb As Long
hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout
If ImmIsIME(hkb) = 0 Then '代表不是中文输入
ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space
End If
End SubPuBlic Sub Chg2English(ByVal hwnd As Long) '传入Control项或Form 的hwnd
Dim hkb As Long
hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout
If ImmIsIME(hkb) = 1 Then '代表是中文输入
ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space
End If
End Sub'以下在Form
Private Sub Form_Load()
Call Chg2Chinese(Me.hwnd)
End Sub
首先谢谢您的答案,还有一些不明白的问题要问您:一般的输入法是如何取字码的,字码与键盘的关系是如何确定的?