如何在vba中使用GetKeyboardLayoutName函数?

api函数GetKeyboardLayoutName在msdn中的说明如下:

Retrieves the name of the active input locale identifier (formerly called the keyboard layout) for the system.

获取系统的当前的键盘布局的句柄的名称。

它的语法如下:

BOOL GetKeyboardLayoutNameW(
  LPWSTR pwszKLID
);

其中参数pwszKLID为接收当前的键盘布局的句柄的名称的缓冲区,包括结尾Null字符。

但是在vba中,不能直接将pwszKLID参数定义为字符串类型,而应该传递字符串变量实际存储地址。

代码如下:

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

注意GetKeyboardLayoutName函数的VB声明形式

Declare Function GetKeyboardLayoutName Lib “user32” Alias “GetKeyboardLayoutNameW” (ByVal pwszKLID As Long) As Long

ByVal pwszKLID As Long

参数pwszKLID传递的是字符串变量的实际存储地址,只有这样声明才能获取到正确的值。

如果将GetKeyboardLayoutName函数与GetKeyboardLayout函数一起使用,我们会发现,它们获取的都是键盘布局的句柄,可以用如下的代码检验:

Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameW" (ByVal pwszKLID As Long) As Long
Declare Function GetKeyboardLayout Lib "user32" (ByVal idThread 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), ""))
    Dim hkl As Long
    hkl = GetKeyboardLayout(0)
    Debug.Print str1, VBA.Hex(hkl), str1 = VBA.Hex(hkl)
End Sub

GetKeyboardLayoutName函数获取的键盘布局名称就是GetKeyboardLayout函数获取的句柄的16进制值。

       

发表评论