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.

-1voto

casperOne Punkte 72238

Was alle hier zu übersehen scheinen, ist, dass Sie in VBA und nicht in .NET arbeiten. IntPtr ist ein .NET-Typ, der eine plattformspezifische Ganzzahl darstellt. Auf einer 32-Bit-Plattform sind es 32 Bit, auf einer 64-Bit-Plattform sind es 64 Bit.

Da eine HKL ein Typedef für ein Handle ist, das wiederum ein Typedef für PVOID ist, das wiederum ein Typedef für VOID * ist, ist es genau das, was Sie brauchen, wenn Sie .NET verwenden würden.

VBA verfügt über keine Funktionen für 64-Bit-Zahlen, so dass Sie einen anderen Ansatz wählen müssen.

Auf einem 64-Bit-Rechner müssen Sie etwa so vorgehen:

Public Type HKL64
    High As Long
    Low As Long
End Type

Private Declare Function ActivateKeyboardLayout Lib "user32" ( _
    Byval HklHigh As Long, Byval HklLow As Long, _
    ByVal flags As Integer) As HKL64

Diese なければならない ermöglichen es Ihnen, einen 64-Bit-Wert auf dem Stack an die API-Funktion zu übergeben (über zwei Variablen). Wenn Sie diesen Code jedoch sowohl auf 64-Bit- als auch auf 32-Bit-Rechnern verwenden wollen, müssen Sie zwei Deklarationen der API vornehmen und dann festlegen, welche davon aufgerufen werden soll.

Außerdem muss jeder andere Code in VBA, der APIs aufruft, die mit Zeigern oder Handles arbeiten, entsprechend geändert werden, um 64-Bit-Eingaben (nicht 32) zu verarbeiten.

Nebenbei bemerkt ist die ursprüngliche Deklaration von ActivateKeyboardLayout falsch, da sie einen Rückgabetyp von Integer hatte, der ein 16-Bit-Wert ist, während die API einen Typ von HKL zurückgibt, der je nach Plattform 32 oder 64 Bit hat.

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