Ihre Deklaration für das ActivateKeyboardLayout ist eigentlich falsch. Für 32-Bit-Systeme sollte Ihr Code etwa so aussehen:
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
Die 64-Bit-Version des Betriebssystems ist in diesem Fall eine Art Ablenkungsmanöver. Da Sie eine VBA-Anwendung ausführen, muss diese unabhängig vom Betriebssystem als 32-Bit-Anwendung ausgeführt werden. Ich vermute, dass Ihr Problem darin besteht, dass auf Ihrem Vista-System das von Ihnen gewünschte Punjabi-Tastaturlayout nicht geladen ist. ActivateKeyboardLayout funktioniert nur, um ein Tastaturlayout zu aktivieren, das bereits geladen ist. Aus irgendeinem Grund waren die Entwickler dieser API der Meinung, dass ein Fehler aufgrund eines nicht vorhandenen Tastaturlayouts keinen Fehler darstellt, so dass der LastDllError nicht gesetzt ist. Sie sollten LoadKeyboardLayout für diese Art von Situation in Betracht ziehen.
EDIT: Um zu überprüfen, ob das gewünschte Tastaturlayout tatsächlich geladen ist, können Sie dies verwenden:
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
0 Stimmen
Interessant, ich werde das bei meiner Konfiguration (Vista 64) zu Hause ausprobieren. Haben Sie den Code mit Ihrem Access VBA-Aufruf assoziieren?
0 Stimmen
Ich habe die Frage mit dem Code aktualisiert
0 Stimmen
Sie haben Recht. Was ich nicht wußte, ist, daß die Tastaturkonstanten je nach der geladenen Version der Tastatur variieren können. Das hat mich zu der irrigen Meinung verleitet, dass Ihr Code falsch sei. Der Fehler liegt bei mir. Ich habe versucht, ihn zu korrigieren, indem ich die Frage geändert habe.
0 Stimmen
@Stephen, das Prämiensystem wurde geändert und hat es mir ermöglicht, Ihre Antwort als die richtige auszuwählen. Können Sie Ihren Kommentar # 3 & 4 zur Bereinigung entfernen?