vba - 如何使用 VBA 从 64 位 Windows Vista 调用 ActivateKeyboardLayout

标签 vba internationalization vista64 keyboard-layout

在 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/

相关文章:

database - 在数据库中存储国际地址的 "best"方式是什么?

python - django rest framework 如何国际化领域

c++ - Vista-Eclipse (Galileo) CDT w/MinGW 和 MinGW 的 GDB 无法输出 cerr 输出

32bit-64bit - 32位应用程序如何在Windows Vista 64位上找到64位Program Files目录的位置?

vba - 从 excel/vba 生成电子邮件到 Outlook 时,我的电子邮件签名不会出现?

excel - 使用 IEX API 获取实时股票信息(雅虎财经替代品)?

vba - 将图表从 Excel 复制到 PowerPoint 的脚本出错

java - 获取三个字母的短时区名称(而不是四个字母)?

vba - 如何使用 Outlook VBA 在电子邮件中指定光标位置和文本格式

svn - TortoiseSVN 将无法连接到 Windows Vista 64 上的 subversion