您對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