Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / переключить раскладку для чужого приложения / 25 сообщений из 25, страница 1 из 1
24.11.2010, 22:08
    #36975657
Дмитрий П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Как переключить En-Ru раскладку клавиатуры для другого активного приложения в WinXp? ActivateKeyboardLayout переключает только для своего приложения.


Спасибо.
...
Рейтинг: 0 / 0
25.11.2010, 21:11
    #36977921
Дмитрий П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Тема закрыта - нашел!
...
Рейтинг: 0 / 0
22.01.2011, 19:02
    #37073243
Guest 128
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
И как же?!

Я не нашел. Да и вообще задача считается неразрешимой на VB.
...
Рейтинг: 0 / 0
24.01.2011, 21:34
    #37076374
Дмитрий П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Guest 128,

Да, действительно, я тоже не нашел надежный способ - как переключить раскладку на ЗАДАННУЮ. Но для решения своей задачи я реализовал иной подход:

1. Переключаю раскладку на другую (у меня их только две) имитируя нажатие Alt + Shift.

2. Определяю, а какая после этого стала раскладка в активном элементе активного окна чужого приложения.
...
Рейтинг: 0 / 0
25.01.2011, 17:28
    #37078015
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long

Private Const KBL_RU As Long =  68748313 
Private Const KBL_EN As Long =  67699721 

Private Sub Command1_Click()

    ' Переключить на русский язык
    Call ActivateKeyboardLayout(KBL_RU,  0 &)
    
    ' Переключить на английский язык
    Call ActivateKeyboardLayout(KBL_EN,  0 &)

End Sub
...
Рейтинг: 0 / 0
25.01.2011, 17:29
    #37078018
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Упс... не заметил. Сейчас другой вариант
...
Рейтинг: 0 / 0
25.01.2011, 17:59
    #37078109
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
Private Declare Function LoadKeyboardLayout Lib "user32.dll" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long

Private Const HWND_BROADCAST As Long = &HFFFF&
Private Const WM_INPUTLANGCHANGEREQUEST As Long = &H50
Private Const WM_INPUTLANGCHANGE As Long = &H51

Private Const KBL_EN As String = "00000409" '1033
Private Const KBL_RU As String = "00000419" '1049
Private Const KLF_ACTIVATE  As Long = &H1

Private Const INPUTLANGCHANGE_SYSCHARSET As Long = &H1
Private Const INPUTLANGCHANGE_FORWARD As Long = &H2
Private Const INPUTLANGCHANGE_BACKWARD As Long = &H4


Private Sub Command1_Click()
    Dim hKBLang As Long
    
    hKBLang = LoadKeyboardLayout(KBL_RU, KLF_ACTIVATE)
    
    ' Переключить на русский язык
    Call ActivateKeyboardLayout(hKBLang,  0 &)
    SendMessage HWND_BROADCAST, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_SYSCHARSET, hKBLang
    
    ' Переключить на английский язык
    'Call ActivateKeyboardLayout(KBL_EN, 0&)

End Sub
...
Рейтинг: 0 / 0
25.01.2011, 22:26
    #37078472
Дмитрий П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
VSVLAD,

Да, действительно, это работает, но в оличие от моего варианта, это переключает раскладку сразу во всех запущенных приложениях. Возможно это и не страшно. И код покороче.

Спасибо.
...
Рейтинг: 0 / 0
26.01.2011, 08:10
    #37078717
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Дмитрий П.,

Тогда рассылай не бродкаст-сообщение, а конкретному hWnd и будет тебе щастье
...
Рейтинг: 0 / 0
26.01.2011, 21:27
    #37080550
Guest 128
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Дмитрий П.Guest 128,

Да, действительно, я тоже не нашел надежный способ - как переключить раскладку на ЗАДАННУЮ. Но для решения своей задачи я реализовал иной подход:

1. Переключаю раскладку на другую (у меня их только две) имитируя нажатие Alt + Shift.

2. Определяю, а какая после этого стала раскладка в активном элементе активного окна чужого приложения.Это я тоже пробовал.
На домашнем компьютере не работает вообще, на рабочем - 50/50.
И sendkeys пробовал, и keyb_event.
Потом решил, что нажатие клавиш переключения достаются моему потоку, и попробовал вначале присоединиться к нужному потоку через AttachThreadInput, а потом отослать - результат опять же не особо утешительный.
Зависит от настройки системы?
...
Рейтинг: 0 / 0
26.01.2011, 21:34
    #37080559
Guest 128
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
VSVLAD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
Private Declare Function LoadKeyboardLayout Lib "user32.dll" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long

Private Const HWND_BROADCAST As Long = &HFFFF&
Private Const WM_INPUTLANGCHANGEREQUEST As Long = &H50
Private Const WM_INPUTLANGCHANGE As Long = &H51

Private Const KBL_EN As String = "00000409" '1033
Private Const KBL_RU As String = "00000419" '1049
Private Const KLF_ACTIVATE  As Long = &H1

Private Const INPUTLANGCHANGE_SYSCHARSET As Long = &H1
Private Const INPUTLANGCHANGE_FORWARD As Long = &H2
Private Const INPUTLANGCHANGE_BACKWARD As Long = &H4


Private Sub Command1_Click()
    Dim hKBLang As Long
    
    hKBLang = LoadKeyboardLayout(KBL_RU, KLF_ACTIVATE)
    
    ' Переключить на русский язык
    Call ActivateKeyboardLayout(hKBLang,  0 &)
    SendMessage HWND_BROADCAST, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_SYSCHARSET, hKBLang
    
    ' Переключить на английский язык
    'Call ActivateKeyboardLayout(KBL_EN, 0&)

End Sub
Да!!
Большое человеческое спасибо.

:))

А чего тогда на всех форумах говорят, что это непросто и даже невозможно прямым кодом? По разным языкам неделю шерстил интернет.
На одном даже встретил разработчика от пунтосвичер, он говорил, что надо библиотеку внедрять, что они так и делают.
...
Рейтинг: 0 / 0
27.01.2011, 19:02
    #37082781
Дмитрий П.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
в SendMessage вместо HWND_BROADCAST я поставил ф-ю GetForegroundWindow, тогда раскладка меняется только в том приложении, с которым я в данный момент работаю,будь то Word Notepad или IE. Как раз то что нужно.

to VSVLAD,

Ваш пример успешно работает (я пробовал и дома и на работе) без следущих команд:

Код: plaintext
1.
2.
3.
hKBLang = LoadKeyboardLayout(layout, KLF_ACTIVATE)
........
Call ActivateKeyboardLayout(hKBLang,  0 &)
........

Для этого в hKBLang для SendMessage я напрямую помещаю либо &H4090409 (En) либо &H4190419 (Ru).

В каких случаях эти команды все-таки необходимы?
...
Рейтинг: 0 / 0
28.01.2011, 00:25
    #37083120
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Когда раскладка не загружена, например "Русский" и "Английский" есть. А "Украинский" необходим, тогда нужно его загрузить предварительно.
...
Рейтинг: 0 / 0
22.05.2011, 10:35
    #37273100
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Дмитрий П.Guest 128,


2. Определяю, а какая после этого стала раскладка в активном элементе активного окна чужого приложения.
Подскажи, а как ты определяешь? все коды, которые нашёл, определяют раскладку окна программы а не активного окна
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.08.2014, 02:47
    #38733233
CaSH_2014
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
VSVLAD - ты СУПЕР! Код реально рабочий! 2 года искал !!!!
...
Рейтинг: 0 / 0
26.10.2014, 20:30
    #38787718
intersk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
Игорь ГорбоносДмитрий П.,

Тогда рассылай не бродкаст-сообщение, а конкретному hWnd и будет тебе щастье
речь шла о том чтобы переключать раскладку только в окне Access. Как код VSVLAD надо изменить для этого?
...
Рейтинг: 0 / 0
27.10.2014, 16:42
    #38788420
1315
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
interskИгорь ГорбоносДмитрий П.,

Тогда рассылай не бродкаст-сообщение, а конкретному hWnd и будет тебе щастье
речь шла о том чтобы переключать раскладку только в окне Access. Как код VSVLAD надо изменить для этого?в Акцессе, у полей формы есть параметр "Язык ввода"
...
Рейтинг: 0 / 0
28.10.2014, 13:56
    #38789282
intersk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
1315interskпропущено...

речь шла о том чтобы переключать раскладку только в окне Access. Как код VSVLAD надо изменить для этого?в Акцессе, у полей формы есть параметр "Язык ввода"а если не хочу на каждое поле вешать? (их около 30)
...
Рейтинг: 0 / 0
28.10.2014, 18:01
    #38789721
7064
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
intersk1315пропущено...
в Акцессе, у полей формы есть параметр "Язык ввода"а если не хочу на каждое поле вешать? (их около 30)вешай не на каждое
...
Рейтинг: 0 / 0
29.10.2014, 09:07
    #38790173
intersk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
7064interskпропущено...
а если не хочу на каждое поле вешать? (их около 30)вешай не на каждое
на открытие формы нужно
...
Рейтинг: 0 / 0
29.10.2014, 12:21
    #38790525
8987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
intersk7064пропущено...
вешай не на каждое
на открытие формы нужновешай на открытие формы
...
Рейтинг: 0 / 0
29.10.2014, 14:17
    #38790722
intersk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
8987,
нужно чтобы менялось только в Access, а не по "всему компьютеру"
...
Рейтинг: 0 / 0
29.10.2014, 17:29
    #38791042
6425
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
intersk8987,
нужно чтобы менялось только в Access, а не по "всему компьютеру"автор, ты издиваешся или реально такой "тугой" ?

будет менятся не просто "только в Access", а в рамках Акцесса, для конкретной формы, для конкретного контрола, будет установлен только его конкретный язык, пока контрол в фокусе,
перейдёшь в другое поле - в нём будет язык для этого поля, или тот, который текущий в системе
...
Рейтинг: 0 / 0
30.10.2014, 10:04
    #38791478
intersk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
6425будет менятся не просто "только в Access", а в рамках Акцесса, для конкретной формы, для конкретного контрола, будет установлен только его конкретный язык, пока контрол в фокусе,
перейдёшь в другое поле - в нём будет язык для этого поля, или тот, который текущий в системе реализую метод изменения сразу "всех" полей, а не в ручную прописывать в каждом поле правило
...
Рейтинг: 0 / 0
30.10.2014, 10:11
    #38791489
8544
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переключить раскладку для чужого приложения
intersk6425будет менятся не просто "только в Access", а в рамках Акцесса, для конкретной формы, для конкретного контрола, будет установлен только его конкретный язык, пока контрол в фокусе,
перейдёшь в другое поле - в нём будет язык для этого поля, или тот, который текущий в системе реализую метод изменения сразу "всех" полей, а не в ручную прописывать в каждом поле правило"прописуй" программно
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / переключить раскладку для чужого приложения / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]