API应用秘技(11):调整你的输入法
软件世界
本期看点:用一系列API函数来实现很多系统优化软件的“调整输入法顺序”的功能。
认识API函数
API就是“应用程序接口”(Application Programing Interface),是一些用C语言编写,由操作系统自身调用的函数。Windows API函数由许多“动态链接库”或DLL组成。在API的下层是操作系统核心,而上层则是应用程序。
API函数类似一些游戏中的“必杀技”,在早期的Windows编程环境中,由于缺乏可视化等技术,程序员几乎只能利用API函数,通过类似于“搭积木”的方法来编制各种应用程序。
现在,程序员如需开发出灵活、实用和高效率的应用程序,我们也会直接使用API函数,在用API函数时不必刻意研究每个参数的具体含义,毕竟可用的API函数有数千个。在这里,我们会通过实例来帮助读者快速掌握一些实用的API函数的用法。大家还可以举一反三地将这些API函数应用到自己的其他程序中。
本期实例效果
在Windows系统中可通过“Ctrl+Shift”组合键来切换中文输入法,但该操作仅使位于列表顶端的输入法被首先调用,通常用户须连续按该组合键才可调用所需的输入法,因此一些系统优化软件通过API函数实现了“输入法调整顺序”功能。
其实这些功能并不神秘,本期的实例就能实现此功能。运行后程序的效果如图1、2。
程序实现方法
设计思路
用API函数来实现输入法调整顺序的思路如下:
(1)使用GetKeyboardLayoutList函数获取所有输入法;
(2)使用ActivateKeyboardlayout函数设置当前输入法;
(3)使用GetKeyboardLayoutname函数获取当前输入法的KeyboardlayoutName;
(4)使用LoadKeyboardLayout函数改变输入法顺序,只须传递目标输入法的KeyboardlayoutName即可。
实现步骤
(1)启动VB,新建标准EXE工程,在窗体上放置一个列表框和一个标签控件,如图3所示:
(2)按表1设置各控件属性(控件尺寸和位置读者可自行设置,其他保持默认值):
(3)输入常数和公共变量声明,代码如下所示:
注:写代码前,先照本期“API函数声明”中的“VB声明”声明函数。
Const KLF_REORDER = &H8
Private NoOfKBDLayout As Long
Private hCurKBDLayout As Long
Private hKB(24) As Long,StrBuffLen As Long
Private StrBuff As String
Private returnstr As String
Private returncount As Long
Private StrIME As String
(4)添加用于显示系统输入法的子程序:
'获取系统输入法的子程序
Sub ShowIME()
Dim i As Integer
List1.Clear
StrBuff = String(255,0)
'获取系统当前的输入法,实现编程思路(1)
hCurKBDLayout = GetKeyboardLayout(0)
'参考API函数声明①
'获取所有的输入法
NoOfKBDLayout = GetKeyboardLayoutLis
t(25,hKB(0)) '参考API函数声明②
For i = 1 To NoOfKBDLayout
'遍历系统所有的输入法
If ImmIsIME(hKB(i - 1))= 1 Then'如为中文输入法,参考API函数声明③
StrBuffLen = 255
returncount = ImmGetDescription(hKB(i - 1), StrBuff, StrBuffLen)'获取输入法的名称,参考API函数声明④
returnstr = Left(StrBuff, returncount)
Else
returnstr = "系统默认"'在中文系统下,如为英文输入法,即系统默认
End If
List1.AddItem returnstr'在列表框中显示输入法
Next i'恢复原输入法
'激活第一个列表框列表项,实现编程思路(2)
ActivateKeyboardLayout hCurKBDLayout, 0'参考API函数声明⑤
List1.ListIndex = 0
End Sub
(5)输入各控件事件代码:
'窗体装载事件
Private Sub Form_Load()
'调用显示系统输入法的过程
ShowIME
End Sub
'列表框双击事件
Private Sub List1_DblClick()
Dim ReturnValue As Long
'如未选择输入法
If List1.ListIndex = -1 Then
'显示警告信息
MsgBox "请选择输入法!"
Exit Sub
End If
'改变输入法顺序
StrIME = String(8, 0)
ActivateKeyboardLayout hKB(List1.ListIndex), 0
ReturnValue = GetKeyboardLayoutName(StrIME) '参考API函数声明⑥
ReturnValue = LoadKeyboardLayout(StrIME, KLF_REORDER) '参考API函数声明⑦
'显示新排序的输入法
ShowIME
End Sub
注:本期实例在Windows2000和VB6环境中试验通过。
本期API函数声明
①GetKeyboardLayout
说明:获取描述应用程序键盘布局的句柄。
返回值:Long型,代表键盘布局的句柄。
参数:
dwLayout:Long型,代表需检查的线程标志符。
VB声明:Declare Function GetKeyboardLayout Lib "user32" Alias "GetKeyboardLayout" (ByVal dwLayout As Long) As Long
②GetKeyboardLayoutList
说明:获取系统所有键盘布局的列表。
返回值:Long型,代表装载至内存的键盘布局数。
参数:
nBuff:Long型,代表lpList数组中的成员数。如为零,则代表获取可用的键盘布局数。
lpList:Long型,代表一个数组,其元素数应和nBuff规定的元素数相等,该数组会随句柄载入可用键盘布局。
VB声明:Declare Function GetKeyboardLayou
tList Lib "user32" Alias "GetKeyboardLayoutList" (ByVal nBuff As Long, lpList As Long) As Long
③ImmIsIME
说明:判别指定输入法是否为指定语言的输入法,可通过该函数来判别是否为中文输入法。
返回值:Long型,如非零,则代表该输入法为指定语言的输入法。
参数:
hkl:Long型,代表需获取的输入法编号。
VB声明:Private Declare Function ImmIsIME Lib "imm32.dll" (ByVal hkl As Long) As Long
④ImmGetDescription
说明:获取指定输入法的名称。
返回值:Long型,代表返回的输入法名称长度。
参数:
hkl:Long型,代表需获取的输入法编号。
lpsz:String型,返回的输入法名称。
uBufLen:Long型,代表存放输入法名称的变量长度。
VB声明:Private Declare Function ImmGetDe
scription Lib "imm32.dll"Alias "ImmGetDescription
A" (ByVal hkl As Long, ByVal lpsz As String, ByVal uBufLen As Long) As Long
⑤ActivateKeyboardLayout
说明:激活新键盘布局,即定义按键在物理键盘上的位置和含义。
返回值:Long型,如执行成功,返回前一个键盘布局的句柄,如为零则代表失败。
参数:
HKL: Long型,设置键盘布局的句柄。该布局随LoadKeyboardLayout 或 GetKeyboardLayoutList函数载入。
Flags:Long型,用于将指定键盘移至内部键盘布局列表的起始处。
VB声明:Declare Function ActivateKeyboardLayout Lib "user32" Alias "ActivateKeyboardLayout" (ByVal HKL As Long, ByVal flags As Long) As Long
⑥GetKeyboardLayoutName
说明:获取当前活动键盘布局的名称。
返回值:Long型,如非零代表成功,零代表失败。
参数:
pwszKLID:String型。
VB声明:Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
⑦LoadKeyboardLayout
说明:载入键盘布局。
返回值:Long型,代表键盘布局的句柄,如为零则代表出错。
参数:
pwszKLID:String型,用于描述键盘布局名称。
Flags:Long型,可使用常数的组合进行赋值,常用的相关常数如下所示:
(1)KLF_ACTIVATE:载入和激活指定布局。
(2)KLF_NOTELLSHELL:禁止外壳挂钩进程接收HSHELL_LANGUAGE通知。
(3)KLF_REORDER:将指定活动布局移至内部键盘布局列表的起始处。
(4)KLF_REPLACELANG:如指定语言键盘布局已存在,则将其替换。
(5)KLF_SUBSTITUTE_OK: 在注册表中使用替换信息,并载入由用户指定的替换键盘布局。
(6)KLF_UNLOADPREVIOUS:如KLF_ACTIV
ATE已指定并成功,则卸载前一个布局。
VB声明:Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long



