如何在vba中获取到GetKeyboardLayoutName返回的键盘布局名称?

如何在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

当运行了上述代码后,将弹出如下图所示的信息对话框:

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

       

发表评论