控制Windows输入法

软件世界

众所周知,在Windows中我们可以用“Ctrl+Shift”键来调入或切换中文输入法,但是这样做每次都是使位于输入法列表顶端的那个输入法首先被调用。通常我们都要连续按好几次“Ctrl+Shift”才能将习惯的输入法调出。其实利用VB来编程我们就可以达到把任意一个输入法放在输入法列表顶端的目的。

一、编程原理

使用LoadKeyboardLayout函数可以改变输入法的顺序,只要在第一个参数中传递目标输入法的KeyboardlayoutName,第二个参数用KLF_REORDER就可以了。
例如,aa=LoadKeyboardLayout("00000409",KLF_REORDER)使英文变成第一。那么怎样获得KeyboardlayoutName呢?因为使用GetKeyboardLayoutname可以返回当前输入法的KeyboardlayoutName,所以我们可以先用GetKeyboardLayoutList函数来取得所有输入法,再用activateKeyboardlayout()函数设置当前输入法,最后就可以得到它的KeyboardlayoutName了。

二、具体步骤

启动VB,新建一个标准EXE工程。
在窗体Form1上添加一个ComboBox控件(名称为CboLayout)和一个CommandButton控件(名称为CmdChange),Caption设置为“设为默认输入法”。
'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 CmdChange_Click()
If CboLayout.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)) '取得所有输入法
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
按下F5运行后,在列表框中选择目标输入法,按下“设为默认输入法”即可,用鼠标右键单击任务栏右下角中的输入法,选择“属性”,就可以看到默认输入法已经被设置为当前输入法。