在如何在vba中使用GetKeyboardLayoutName函数? 一文中我们介绍了api函数GetKeyboardLayoutName返回的值,它的返回值其实也是键盘布局的句柄。
比如运行如下的代码:
Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameW" (ByVal pwszKLID As Long) As Long
Sub QQ1722187970()
Dim str1 As String
'先填充缓存区
str1 = Space(100)
'获取str1变量的实际存储地址
i = StrPtr(str1)
'传递i的值
GetKeyboardLayoutName i
'获取返回的键盘布局的名称
str1 = Trim(VBA.Replace(str1, Chr(0), ""))
Debug.Print str1
End Sub
立即窗口中输出的值为:E0210804。
那么E0210804到底是什么,它对应的又是什么呢?
所有的这些都可以在注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Keyboard Layouts中找到答案。
如下图所示:

有了以上的知识,我们就可以灵活地对键盘布局进行判断,用如下的代码可以返回键盘布局实际对应的名称:
Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameW" (ByVal pwszKLID As Long) As Long
Sub QQ1722187970()
Dim str1 As String
'先填充缓存区
str1 = Space(100)
'获取str1变量的实际存储地址
i = StrPtr(str1)
'传递i的值
GetKeyboardLayoutName i
'获取返回的键盘布局的名称
str1 = Trim(VBA.Replace(str1, Chr(0), ""))
Debug.Print str1
MsgBox RegRead(str1)
End Sub
Function RegRead(ByVal sKB As String)
Dim oWShell
Set oWShell = CreateObject("WScript.Shell")
Dim sValue As String
Dim sKey As String
'键的名称
sKey = "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Keyboard Layouts\" & sKB
'键值的名称
sValue = "Layout Text"
With oWShell
'sKey & "\" & sValue返回的是键的指定键值的数据
RegRead = .RegRead(sKey & "\" & sValue)
End With
End Function
当运行了上述代码后,将弹出如下图所示的信息对话框:

通过这样的方式,我们可以快速地判断当前使用的输入法。


发表评论