5 Stimmen

Wie kann ich ActivateKeyboardLayout unter 64bit Windows Vista mit VBA aufrufen?

Mit VBA konnte ich unter XP ActivateKeyboardLayout aufrufen, um die Eingabesprache von Englisch auf eine andere Sprache umzustellen. Dies funktioniert jedoch nicht mehr unter Vista64.

Gibt es Vorschläge oder Umgehungsmöglichkeiten?

Der Code, der unter XP funktionierte, war ähnlich wie der folgende:

Private Declare Function ActivateKeyboardLayout Lib "user32" ( _
    ByVal HKL As Long, ByVal flags As Integer) As Integer
Const aklPUNJABI As Long = &H4460446
ActivateKeyboardLayout aklPUNJABI, 0

Es gab den Vorschlag, zu versuchen

Public Declare Function ActivateKeyboardLayout Lib "user32" ( _
    ByVal nkl As IntPtr, ByVal Flags As uint) As Integer

Wenn ich dies versuche, erhalte ich die Fehlermeldung:

Variable verwendet einen Automationstyp, der in Visual Basic nicht unterstützt wird

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.

5voto

Stephen Martin Punkte 9256

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

0voto

Ana Betts Punkte 72423

Dies ist nur eine blinde Vermutung, aber haben Sie versucht, Ihre Anwendung als erweiterter Administrator auszuführen, um zu sehen, ob es einen Unterschied macht? Wie lautet der Fehlercode/Wert von GetLastError?

0voto

VonC Punkte 1117238

Haben Sie versucht, eine .Net-Zeile (wie in VB.Net-Skript o diese Schnipsel ) wie:

InputLanguage.CurrentInputLanguage = 
    InputLanguage.FromCulture(New System.Globalization.CultureInfo("ar-EG"))

InputLanguage sollte für Vista64 unterstützt werden mit einer .Net3.5

VB.Net-Code:

Public Sub ChangeInputLanguage(ByVal InputLang As InputLanguage)
   If InputLanguage.InstalledInputLanguages.IndexOf(InputLang) = -1 Then
        Throw New ArgumentOutOfRangeException()
   End If
    InputLanguage.CurrentInputLanguage = InputLang
End Sub

0voto

Aidan Ryan Punkte 11109

Für 64-Bit-Portabilität müssen Sie möglicherweise IntPtr verwenden. Können Sie das ausprobieren?

Public Declare Function ActivateKeyboardLayout Lib "user32" (ByVal nkl As IntPtr, ByVal Flags As uint) As Integer

0voto

Marc Durdin Punkte 1575

In 64-Bit-Editionen von Office-Anwendungen ist VBA tatsächlich 64-Bit. Siehe Office 2010-Dokumentation für Einzelheiten zu den Änderungen. Für das Beispiel, das in Antwort von Stephen Martin müssen Sie den Code wie folgt ändern, um die PtrSafe Attribut und korrigieren Sie die Parameter, die ein HKL Typ in der Win32-API:

Private Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, _
    ByVal flags As Long) As LongPtr

Const aklPUNJABI As LongPtr = &H4460446
Dim oldLayout as LongPtr
oldLayout = ActivateKeyboardLayout(aklPUNJABI, 0)
If oldLayout = 0 Then
   'Oops an error'
Else
   'Save old layout for later restore?'
End If

y

Private Declare PtrSafe Function GetKeyboardLayoutList Lib "user32" (ByVal size As Long, _
    ByRef layouts As LongPtr) As Long

Dim numLayouts As Long
Dim i As Long
Dim layouts() As LongPtr

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X