Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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";)

именно так

не получается у меня эту раскладку добавить, при переводе 0x040e (040e) получается 1038, подставляю в таком виде:



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 :)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам