powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / переключить раскладку для чужого приложения
25 сообщений из 25, страница 1 из 1
переключить раскладку для чужого приложения
    #36975657
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как переключить En-Ru раскладку клавиатуры для другого активного приложения в WinXp? ActivateKeyboardLayout переключает только для своего приложения.


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

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

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

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

2. Определяю, а какая после этого стала раскладка в активном элементе активного окна чужого приложения.
...
Рейтинг: 0 / 0
переключить раскладку для чужого приложения
    #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
переключить раскладку для чужого приложения
    #37078018
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс... не заметил. Сейчас другой вариант
...
Рейтинг: 0 / 0
переключить раскладку для чужого приложения
    #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
переключить раскладку для чужого приложения
    #37078472
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

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

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

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

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

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

2. Определяю, а какая после этого стала раскладка в активном элементе активного окна чужого приложения.Это я тоже пробовал.
На домашнем компьютере не работает вообще, на рабочем - 50/50.
И sendkeys пробовал, и keyb_event.
Потом решил, что нажатие клавиш переключения достаются моему потоку, и попробовал вначале присоединиться к нужному потоку через AttachThreadInput, а потом отослать - результат опять же не особо утешительный.
Зависит от настройки системы?
...
Рейтинг: 0 / 0
переключить раскладку для чужого приложения
    #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
переключить раскладку для чужого приложения
    #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
переключить раскладку для чужого приложения
    #37083120
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда раскладка не загружена, например "Русский" и "Английский" есть. А "Украинский" необходим, тогда нужно его загрузить предварительно.
...
Рейтинг: 0 / 0
переключить раскладку для чужого приложения
    #37273100
Фотография BelowZero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий П.Guest 128,


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

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

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

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

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


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