在 XP 下运行 VBA 我能够调用 ActivateKeyboardLayout 将我的输入语言从英语切换到另一种语言。但是,这在 Vista64 下不再起作用。
有什么建议或解决方法吗?
过去在 XP 下工作的代码类似于以下内容:
Private Declare Function ActivateKeyboardLayout Lib "user32" ( _
ByVal HKL As Long, ByVal flags As Integer) As Integer
Const aklPUNJABI As Long = &H4460446
ActivateKeyboardLayout aklPUNJABI, 0
有人建议尝试
Public Declare Function ActivateKeyboardLayout Lib "user32" ( _
ByVal nkl As IntPtr, ByVal Flags As uint) As Integer
当我尝试此操作时,我收到错误消息:
变量使用 Visual Basic 不支持的自动化类型
最佳答案
您对ActivateKeyboardLayout 的声明实际上是不正确的。对于 32 位系统,您的代码应如下所示:
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, _
ByVal flags As Long) As Long
Const aklPUNJABI As Long = &H4460446
Dim oldLayout as Long
oldLayout = ActivateKeyboardLayout(aklPUNJABI, 0)
If oldLayout = 0 Then
'Oops an error'
Else
'Save old layout for later restore?'
End If
在这种情况下,64 位操作系统有点转移注意力。由于您正在运行 VBA 应用程序,因此无论操作系统如何,它都必须作为 32 位应用程序运行。我怀疑您的问题可能是在您的 Vista 系统上未加载您想要的旁遮普键盘布局。 ActivateKeyboardLayout 仅适用于激活已加载的键盘布局。由于某种原因,该 API 的设计者认为由于键盘布局不存在而导致的失败不是错误,因此未设置 LastDllError。对于这种情况,您可能需要考虑使用 LoadKeyboardLayout。
编辑:要仔细检查您尝试获取的键盘布局是否确实已加载,您可以使用以下命令:
Private Declare Function GetKeyboardLayoutList Lib "user32" (ByVal size As Long, _
ByRef layouts As Long) As Long
Dim numLayouts As Long
Dim i As Long
Dim layouts() As Long
numLayouts = GetKeyboardLayoutList(0, ByVal 0&)
ReDim layouts(numLayouts - 1)
GetKeyboardLayoutList numLayouts, layouts(0)
Dim msg As String
msg = "Loaded keyboard layouts: " & vbCrLf & vbCrLf
For i = 0 To numLayouts - 1
msg = msg & Hex(layouts(i)) & vbCrLf
Next
MsgBox msg
关于vba - 如何使用 VBA 从 64 位 Windows Vista 调用 ActivateKeyboardLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/449207/