Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 22:11   #11
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, вы используете два языка. Так?
Допустим, русский и английский.

Если вам надо напечатать на русском языке, вы переключаете язык клавиатуры и печатаете на русском языке. Если вам надо печатать на английском языке, вы переключаете язык клавиатуры на английский язык и печатаете на английском языке.

Или у вас по-другому как-то?
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 22:24   #12
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Если документ русско-английский, то альт-шифт переключает между ними. Если, скажем, грузинско-английский, то выбираю русский, контрал-шифт - грузинский. После чего альт-шифт переключает между грузинским и английским.
Vadim39 вне форума Ответить с цитированием
Старый 22.05.2013, 12:37   #13
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Код, который переключает раскладку клавиатуры на раскладку с английским языком.

Только средствами языка "VBA" не получилось решить эту задачу и я использовал API-функцию.


Этот код нужно поместить в самый верх модуля, перед всеми процедурами:
Код:
'Т.к. средствами языка "VBA" не получается решить поставленную задачу,
    'то нужно использовать дополнительные средства.
    'Воспользуемся API-фукцией.
Declare Function GetKeyboardLayoutList Lib "user32" _
    (ByVal nBuff_In As Long, lpList_Out As Long) As Long
Этот код нужно поместить в тот же модуль, что и код выше:
Код:
Sub Procedure_1()
    
    Dim myList(1 To 100) As Long
    Dim myCount As Long
    Dim i
    
    '1. Вызываем API-функцию.
    'Список всех раскладок попадёт в массив "myList".
    'В скобках - myList(1) - указываем число "1" - не знаю зачем.
    'Первый аргумент - UBound(myList) - это сколько нам нужно
        'получить раскладок клавиатур.
    'В переменную "myCount" поместится количество
        'раскладок клавиатур, которые пользователь установил на компьютере.
    myCount = GetKeyboardLayoutList(UBound(myList), myList(1))
    
    '2. Получаем список всех раскладок клавиатуры, 
        'которые пользователь установил.
    For i = 1 To myCount Step 1
        'Вывод результата в View - Immediate Window.
        Debug.Print myList(i)
    Next i
    
    'Раскладка клавиатуры представлена в макросе
        'числом из 8 цифр. Первые четыре цифры означают язык.
        'Для английского языка это число "6769".
    '3. Переключаем раскладку клавиатуры на раскладку с английским языком.
    For i = 1 To myCount Step 1
        
        'Если раскладка содержит английский язык.
        If Left(myList(i), 4) = "6769" Then
        
            'VBA-Word-средствами (а не API-средствами)
                'переключаем раскладку клавиатуры.
            Application.Keyboard myList(i)
            
            'Выходим из цикла, т.к. сделали то, что хотели.
            Exit For
            
        End If
            
    Next i
    
End Sub

Последний раз редактировалось Скрипт; 22.05.2013 в 13:22.
Скрипт вне форума Ответить с цитированием
Старый 22.05.2013, 17:59   #14
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Еще раз большое спасибо за подробные разъяснения. Узнал много нового и интересного. Но, к сожалению, мое врожденное косноязычие до сих пор не позволило внятно описать задачу: Узнать коды раскладок получалось и раньше: вручную переключаясь по очереди в каждую из них и запуская
Код:
Debug.Print Application.Keyboard
Проблема не в этом. Команда
Код:
Application.Keyboard номер
где номер - это соответствующая раскладака, устанавливает только один из языков клавиатуры, но не одну из раскладок в пределах одного языка. Скажем есть три значения этого номера: a,b,c. a - английский, в котором только одна раскладка клавиатуры. b - русский-русская, c - русский-грузинская. Команда
Код:
Application.Keyboard a
переключает в английский. Но обе команды:
Код:
Application.Keyboard b
Application.Keyboard с
переключают только в одно состояние. В моем случае - русский-грузинская. Таким образом, в половине случаев нет возможности вернуть раскладку, в то состояние, которое было до процедуры.
Впрочем, все это имеет только академический интерес, поскольку, как я уже писал выше, я решил проблему, назначив вызов диалога на другую клавишу.

Последний раз редактировалось Vadim39; 22.05.2013 в 18:26.
Vadim39 вне форума Ответить с цитированием
Старый 22.05.2013, 18:10   #15
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Почему нет?! Запомните её в переменной, а перед концом процедуры — верните (из той переменной).

Цитата:
Сообщение от Vadim39 Посмотреть сообщение
Дело в том, что мне нужно создать рабочую среду для редактора. Скрипт работает таким образом, что находясь на определенном слове и запустив его он получает подготовленный диалог для замены, в котором, возможно, ему придется подкорректировать поле "Заменить на:".
А он (ваш редактор) до вашей разработки нажимал Ctrl-h и затем Tab?

Поле ввода "Найти" при этом, как мы знаем, уже содержит выделенный текст.
Цитата:
Сообщение от Vadim39 Посмотреть сообщение
...если назначить на F11, диалог не вызывается при любой раскладке клавиатуры... Полный бред
Ну не полный — клавиша F11 зарезервирована для перехода в Word к очередному полю.

Последний раз редактировалось Sasha_Smirnov; 22.05.2013 в 18:12.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 22.05.2013, 18:38   #16
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, да, вы правы, VBA-Word-средствами не получается решить вашу задачу и нужно использовать сторонние средства, я буду использовать API-функцию.

Этот код поместите в самый верх модуля (выше всех процедур):
Код:
'Т.к. VBA-средствами не получается решить поставленную задачу,
    'то нужно использовать дополнительные средства.
    'Воспользуемся API-функцией.

'ActivateKeyboardLayout - переключает у клавиатуры раскладку.
Declare Function ActivateKeyboardLayout Lib "user32" _
    (ByVal HKL_in As Long, ByVal flags_in As Long) As Long
В тот же модуль, что и код выше, поместите этот код:

Код:
Sub Procedure_1()
    
    Dim myPreviousLayout As Long
    
    'Переключаем раскладку клавиатуры на раскладку с нужным языком.
        'В переменную "myPreviousLayout" попадёт число-идентификатор
        'раскладки, которая была до запуска функции "ActivateKeyboardLayout".
        'Т.е. запоминаем, какая была раскладка клавиатуры, чтобы
        'потом вернуть обратно.
    'Первый параметр - это номер-идентификатор раскладки клавиатуры,
        'на которую нужно переключиться.
    'Второй параметр - я не понял, что это такое. Если ставить ноль,
        'то считается (я так думаю), что мы не используем второй параметр.
    myPreviousLayout = ActivateKeyboardLayout(70714377, 0)

    'Возвращаем прежнюю раскладку клавиатуры.
    ActivateKeyboardLayout myPreviousLayout, 0

End Sub

Примечание

Для работы с API-функциями можно заглядывать в книгу:
Автор: Эпплман
Название: Win 32 API и Visual Basic для профессионалов
Глава для работы с клавиатурой: Аппаратные и системные функции
Раздел: Функции для работы с клавиатурой и другие функции ввода.

В конце книги есть предметный указатель, по которому можно искать нужную функцию.

Последний раз редактировалось Скрипт; 22.05.2013 в 22:51.
Скрипт вне форума Ответить с цитированием
Старый 22.05.2013, 22:27   #17
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Скрипт Теперь все работает. Еще раз большущее спасибо!
Vadim39 вне форума Ответить с цитированием
Старый 22.05.2013, 22:36   #18
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Почему нет?! Запомните её в переменной, а перед концом процедуры — верните (из той переменной).
Так в том то и дело, что средствами VBA не возвращает всю раскладку, а только язык.
Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
А он (ваш редактор) до вашей разработки нажимал Ctrl-h и затем Tab?
Именно, и это его безмерно утомляло Но теперь, благодаря помощи уважаемого Скрита, можно будет съэкономить на молоке за редакторский вред

Насчет F11 я не совсем понял: что с того, что она зарезервирована? Я же ее переназначал и при нажатии вручную она делала что надо. А из скрипта - нет.
Vadim39 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с SendKeys termitru Win Api 1 26.07.2011 22:21
Где найти модуль SendKeys? saylar_06 Общие вопросы Delphi 4 29.05.2011 19:20
application.sendkeys "~" ruavia3 Microsoft Office Excel 1 12.02.2010 16:24
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37