Как я могу назвать ActivateKeyboardLayout от Windows Vista на 64 бита с помощью VBA

Вам следует скачать файл sql для этого wordpress и заменить старый URL новым URL, например, « http://example.com » на « http://example.com/blog [ 111] "

5
задан Noah 1 October 2010 в 21:31
поделиться

5 ответов

Ваше объявление для 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
5
ответ дан 15 December 2019 в 01:12
поделиться

Это - просто слепое предположение, но Вы попытались запустить свое приложение как повышенный администратор, чтобы видеть, имеет ли это значение? Каков код ошибки / значение GetLastError?

0
ответ дан 15 December 2019 в 01:12
поделиться

Сделал Вы пробуете строку .NET (как в сценарии VB.Net или тех отрывках) как:

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

InputLanguage должен поддерживаться для Vista64 с.Net3.5

Код VB.Net:

Public Sub ChangeInputLanguage(ByVal InputLang As InputLanguage)
   If InputLanguage.InstalledInputLanguages.IndexOf(InputLang) = -1 Then
        Throw New ArgumentOutOfRangeException()
   End If
    InputLanguage.CurrentInputLanguage = InputLang
End Sub
0
ответ дан 15 December 2019 в 01:12
поделиться

Для 64-разрядной мобильности Вы, возможно, должны использовать IntPtr. Можно ли дать этому выстрел?

Public Declare Function ActivateKeyboardLayout Lib "user32" (ByVal nkl As IntPtr, ByVal Flags As uint) As Integer
0
ответ дан 15 December 2019 в 01:12
поделиться

Вещь, которую все, кажется, пропускают здесь, состоит в том, что Вы работаете в VBA, не в.NET. IntPtr является типом.NET, который представляет целое число, которое является собственным на платформу. На 32-разрядной платформе это - 32 бита на платформе на 64 бита, это - 64 бита.

Учитывая, что HKL является определением типа для дескриптора, который является определением типа для PVOID, который является определением типа для ПУСТОТЫ *, это точно, в чем Вы нуждаетесь при использовании.NET.

VBA ничего не имеет для 64-разрядных чисел, таким образом, необходимо проявить другой подход.

На 64-разрядной машине необходимо будет сделать что-то вроде этого:

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

Это должно позволить Вам передавать 64 битовых значения стеку к API-функции (через две переменные). Однако, если Вы собираетесь использовать этот код на машинах на 32 бита и на 64 бита, Вы оказываетесь перед необходимостью делать два объявления API и затем определять который звонить.

Кроме того, любой другой код в VBA, который называет API, которые имеют дело с указателями или дескрипторами, должен будет быть изменен соответственно для обработки входа на 64 бита (не 32).

На ноте стороны исходное объявление ActivateKeyboardLayout является неправильным, поскольку это имело тип возврата Целого числа, которое является 16-разрядным значением, в то время как API возвращает тип HKL, который составляет 32 или 64 бита, в зависимости от платформы.

-1
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: