您对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
有趣,我会在家里检查我的配置(Vista 64)。你有代码与你的Access VBA调用关联吗? – VonC 2009-02-13 13:47:17
我已更新问题代码 – Noah 2009-02-13 14:12:46
您是对的。我不知道的一个项目是键盘常量可能会有所不同,具体取决于加载的键盘版本。这让我误以为你的代码是不正确的。错误是我的。我试图通过修改这个问题来解决这个问题。 – Noah 2009-02-21 14:14:03