Страница: 1 | 2 |
Вопрос: Проблема с API
Добавлено: 12.07.08 13:51
Автор вопроса: olesis
Нашел на этом форуме такой вот код:
Private Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
Public Sub SetLanguage(ByVal s As String)
Select Case UCase(s)
Case "R"
LoadKeyboardLayout("00000419", KLF_ACTIVATE)
Case "U"
LoadKeyboardLayout("00000422", KLF_ACTIVATE)
Case "E"
LoadKeyboardLayout("00000409", KLF_ACTIVATE)
Case Else
End Select
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SetLanguage("U")
End Sub
всё прекрасно работает, в раскладку клавиатуры добавляется новая раскладка (украинская). Далее хотел выгрузить так же программно эту раскладку, вот этим кодом
Private Declare Function UnloadKeyboardLayout Lib "user32" Alias "UnloadKeyboardLayout" (ByVal hkl As Long) As Long
Public Sub RemoveLanguage(ByVal s As String)
Select Case UCase(s)
Case "R"
UnloadKeyboardLayout("00000419")
Case "U"
UnloadKeyboardLayout("00000422")
Case "E"
UnloadKeyboardLayout("00000409")
Case Else
End Select
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
RemoveLanguage("U")
End Sub
Но не работает, в MSDN прочитал:
Если функция не выполняет задачу, величина возвращаемого значения нулевая. Функция может потерпеть неудачу по следующим причинам:
1. Был послан недопустимый дескриптор раскладки символов на клавиатуре.
2. Раскладка была предварительно загружена.
3. Раскладка находится в использовании.
1. Вроде верное
2. Добавлял руками, и пробовал выгрузить русский/английский не помогло
3. Раскладка не активна
что делаю не так?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #1
Добавлено: 12.07.08 15:53
а, забыл константу ещё
Private Const KLF_ACTIVATE = 1
Номер ответа: 2
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #2
Добавлено: 12.07.08 16:20
А функция возвращает 0?
Номер ответа: 3
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #3
Добавлено: 12.07.08 19:38
Да нет, большое число возвращает, смотрел через
Private Declare Function GetLastError Lib "kernel32" () As Long
Я правильно понимаю что UnloadKeyboardLayout удалит из списка раскладки клавиатуры заданный язык? а то читал где то что эта API выгружает из приложения заданную раскладку
Номер ответа: 4
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #4
Добавлено: 12.07.08 20:04
Ещё сразу небольшой вопрос, в MSDN идентификаторы раскладок в таком виде:
0x040e Hungarian (Hungary)
0x040f Icelandic (Iceland)
0x0419 Russian (Russia)
т.е с русским более менее понятно (00000419) а как с этими быть? что это за система счисления? ак перевести в вид пригодный для использования?
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 12.07.08 20:21
16-ричная система счисления.
Перевести через калькулятор Windows или
&H040E
Private Declare Function GetLastError Lib "kernel32" () As Long
При чем тут GetLastError?
Смотри что возвращает сама UnloadKeyboardLayout!
Если GetLastError позволяет определить какая именно ошибка произошла!
Номер ответа: 6
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #6
Добавлено: 12.07.08 22:09
Я просто не пойму как, так что ли? )
Dim temp As Long
temp=UnloadKeyboardLayout("00000419"
?
Номер ответа: 7
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #7
Добавлено: 12.07.08 22:18
16-ричная система счисления.
Перевести через калькулятор Windows или
&H040E
не получается у меня эту раскладку добавить, при переводе 0x040e (040e) получается 1038, подставляю в таком виде:
LoadKeyboardLayout("00001038", KLF_ACTIVATE)
не выходит, что то я туплю )
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 12.07.08 23:08
Dim temp As Long
temp=UnloadKeyboardLayout("00000419"
именно так
LoadKeyboardLayout("00001038", KLF_ACTIVATE)
не выходит, что то я туплю )
Стоп, попробуй просто "0000040E"
Это 16-ричная система счисления.
Номер ответа: 9
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #9
Добавлено: 13.07.08 09:32
Стоп, попробуй просто "0000040E"
Отлично добавилось, но, заметил непонятную вещь, язык добавился, а как только закрыл приложение он пропал, опять запускаю опять появляется, это что язык грузиться для отдельного приложения чтоли причем пропадает только из списка раскладки клавиатуры, в панели управления он виден, но Unload так же не срабатывает, вот что вернул: 8975925793972551680, я так понял это максимальное число которое в Long вмещается
Номер ответа: 10
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #10
Добавлено: 13.07.08 14:03
А может быть можно чере реестр посмотреть раскладки которые сейчас доступны для переключения, и удалить не нужные?
Номер ответа: 11
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #11
Добавлено: 14.07.08 20:15
Все может быть...
Номер ответа: 12
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #12
Добавлено: 15.07.08 14:24
Обнадежил
Номер ответа: 13
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #13
Добавлено: 15.07.08 14:24
Кстати 0 возвращает функция, через Err.LastDllError
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 15.07.08 19:06
Кстати 0 возвращает функция, через Err.LastDllError
Какая функция возвращает 0, не понял
Номер ответа: 15
Автор ответа:
olesis
Вопросов: 4
Ответов: 30
Профиль | | #15
Добавлено: 15.07.08 22:18
Разобрался, нужно было слать напрямую в шестнадцатиричном виде без переменных и т.д, и объявить API как Integer