KeyboardLayout аналогично раскладке стороннего приложения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

KeyboardLayout аналогично раскладке стороннего приложения

Сообщение Space » 05.05.2009 (Вт) 2:17

GetKeyboardLayout(0) читает раскладку активного треда моей проги. А как прочитать раскладку активного окна сторонней проги и установить её у себя (ActivateKeyboardLayout)?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: KeyboardLayout аналогично раскладке стороннего приложения

Сообщение awl100Alex » 05.05.2009 (Вт) 9:28

Насколько знаю: винда сама запоминает и возвращает расскладки для каждого окна. То есть, как только окно активизируется, винда возвращает ей раскладку с которой она работала. Тебе нужно просто отследить активность этой стронней проги (hWnd = GetForegroundWindow()) и считать раскладку.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: KeyboardLayout аналогично раскладке стороннего приложения

Сообщение iGrok » 05.05.2009 (Вт) 11:23

Вот тут что-то есть:
http://www.gotdotnet.ru/Forums/Windows/593701.aspx
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: KeyboardLayout аналогично раскладке стороннего приложения

Сообщение arthur2 » 06.05.2009 (Ср) 21:20

Код: Выделить всё
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))
Артур
 
   

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: KeyboardLayout аналогично раскладке стороннего приложения

Сообщение awl100Alex » 16.05.2009 (Сб) 23:30


phantomstealth
Новичок
Новичок
Аватара пользователя
 
Сообщения: 35
Зарегистрирован: 14.05.2009 (Чт) 20:51
Откуда: г. Шахты

Re: KeyboardLayout аналогично раскладке стороннего приложения

Сообщение phantomstealth » 16.05.2009 (Сб) 23:51

Извиняюсь, может быть не мой топик, но у меня похожая проблема, мой прога, не может определить какая раскладка включена в Internet Explorer 7. Там оказывается две раскладки одна для адресной строки ее она и считывает, обычно она английская, а ту раскладку, что внутри окна, я не могу считать. Никто не подскажет как это сделать иначе?
Homini Hominius Lupus Est

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 31.08.2010 (Вт) 15:24

phantomstealth писал(а):Извиняюсь, может быть не мой топик, но у меня похожая проблема, мой прога, не может определить какая раскладка включена в Internet Explorer 7. Там оказывается две раскладки одна для адресной строки ее она и считывает, обычно она английская, а ту раскладку, что внутри окна, я не могу считать. Никто не подскажет как это сделать иначе?
Кстати, да. Столкнулся с тем же самым.
У одного процесса две раскладки (для разных окон) быть не может. Я правильно понимаю?
Походу (судя по менеджеру задач) у IE запущены два процесса, которые как-то скомпонованы в одном родительском окне. Возможно, через SetParent/
В результате:
GetWindowThreadProcessId(GetForegroundWindow(), 0)
видимо возвращает не тот процесс. И имеем не ту раскладку.
Значок ru-en на панели задач, однако всё отслеживает четко, значит выход должен быть. Никто не знает?

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Денис » 31.08.2010 (Вт) 15:46

aigorv писал(а):значит выход должен быть. Никто не знает?


Ну, допустим если речь идет именно об IE, то можно предположить два варианта:
• Почитать мануалы по MSDN на предмет наличия у ослика особых уличных API-функций или интерфейсов.
• Перебирать оба процесса iexplore напрямую и вытягивать из них GetKeyboardLayout поочередно и смотреть.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 31.08.2010 (Вт) 16:02

Денис писал(а):Перебирать оба процесса iexplore напрямую и вытягивать из них GetKeyboardLayout поочередно и смотреть.
Только непонятно, окно какого из них сейчас активно. Где клавиши жмут.
Попробовал GetActiveWindow, но тот всегда возвращает, как я понял, активное окно моего процесса.

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 01.09.2010 (Ср) 9:05

Собственно, вся задача сводится к тому, чтобы найти контрол, имеющий фокус ввода. Активный контрол, расположенный на фореграунд виндоус.
Погуглив интернет понял, что задача нерешаемая. Нигде в похожих темах похожую задачу не решили.
... При этом сам виндоус знает, какой контрол у него активен, и соответствующим образом его прорисовывает!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Денис » 01.09.2010 (Ср) 9:24

Значит GetForegroundWindow и GetActiveWindow не подходят. Это там выше в прошлом году речь шла видимо о проверке по таймеру, когда юзер сидит в эксплоере а наша прога логи пишет, в какой он там сейчас раскладке.

Значит надо явно вытягивать хендл процесса и работать с ним.

Нигде в похожих темах похожую задачу не решили.


В англоязычном нете тоже искал?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 01.09.2010 (Ср) 10:59

Да, смотрел все, что попадалось по запросу имени айпишной функции, хотя старался больше русские смотреть.
Вроде бы можно юзать AttachThreadInput - перебирать все потоки, коннектится к его очереди ввода, и смотреть у кого стоит очередь ввода с клавиатуры. Попроще не получается.
Ну я уж не заморачивался, меня на тот момент уже заинтересовал поиск АктивКонтрола, а вот это похоже выяснить нельзя. Странно.

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 01.09.2010 (Ср) 11:02

Денис писал(а):Значит надо явно вытягивать хендл процесса и работать с ним.

Вот хендл процесса и не получается вытянуть. Не к чему привязаться, что бы его получить. А всего-то надо знать хендл окна, имеющего в данный момент фокус ввода.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение arthur2 » 02.09.2010 (Чт) 5:18

поиск окна с кареткой (и ещё, кстати, многими вкусностями) решается функцией GetGUIThreadInfo
Артур
 
   

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 02.09.2010 (Чт) 9:05

arthur2 писал(а):поиск окна с кареткой (и ещё, кстати, многими вкусностями) решается функцией GetGUIThreadInfo

Угу, только ей на вход надо передать идентификатор потока, который я как раз и пытаюсь найти.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение arthur2 » 02.09.2010 (Чт) 17:03

Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 02.09.2010 (Чт) 17:22

У одного процесса две раскладки (для разных окон) быть не может. Я правильно понимаю?
Нет, не правильно. Раскладка специфична для потока. Если создать два окна в двух разных потоках, то и раскладки в них будут различными. Именно эту картину мы и можем лицезреть в IE, вплоть до последних версий.
А я все практикую лечение травами...

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 03.09.2010 (Пт) 10:23

arthur2 писал(а):Ноль передавай :D

Вау, точно!
Спасибо!

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 03.09.2010 (Пт) 10:32

Twister писал(а):
У одного процесса две раскладки (для разных окон) быть не может. Я правильно понимаю?
Нет, не правильно. Раскладка специфична для потока. Если создать два окна в двух разных потоках, то и раскладки в них будут различными. Именно эту картину мы и можем лицезреть в IE, вплоть до последних версий.

Нет. Раскладка специфично именно для процесса, в котором может быть несколько потоков.
Именно поэтому GetKeyboardLayout мы берем от идентификатора всего процесса, а не отдельного потока.
И именно эту картину мы и лицезреем в IE - они могли бы в запущенном процессе присобачить второй поток с другой раскладкой, но этого не делают, а вынуждены запускать именно второй процесс, окна которого (с другой раскладкой) и встраиваются в главное окно первого процесса.
Мне так кажется, во всяком случае. И, честно говоря, не встречал приложений, сколько бы многопоточными они не были, чтобы для разных окон была реализована разная раскладка. В одном процессе,в смысле.
Не?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 03.09.2010 (Пт) 10:43

Нет. Раскладка специфично именно для процесса
Если это так, то почему в GetKeyboardLayout передается TID, а не PID? ;)
Думаем! Смотрим в msdn и думаем! :)

http://msdn.microsoft.com/en-us/library/ms646296(VS.85).aspx писал(а):Retrieves the active input locale identifier (formerly called the keyboard layout) for the specified thread

http://msdn.microsoft.com/en-us/library/ms646296(VS.85).aspx писал(а):The return value is the input locale identifier for the thread
А я все практикую лечение травами...

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 06.09.2010 (Пн) 10:57

Хм, действительно передается ТИД. Согласен. :roll:
Не знаю, зачем так.
Непонятно тогда, зачем в IE запускается два процесса. Задавшись эти вопросом, я прямо вот сейчас практическим путем убедился, что сменив раскладку для любого из окон - раскладка меняется для всех потоков.
Получается, что раскладка специфична все-таки для процесса, потому микрософт и стартует IE дважды. Во всяком случае, если раскладка меняется сочетанием клавиш.
А ТИД передается в GetKeyboardLayout видимо потому, что достаточно иметь информацию о раскладке в любом потоке, имеющем окно ввода, чтобы судить о приложении в целом.

Впрочем, всё это к теме топика никоим образом не относится, хотя информация интересная, потом кто-нибудь в гугле найдет и прочитает :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение alibek » 06.09.2010 (Пн) 11:40

aigorv писал(а):Непонятно тогда, зачем в IE запускается два процесса.

Первый процесс — диспетчер.
Второй и последующие — непосредственно браузеры во вкладках.
Lasciate ogni speranza, voi ch'entrate.

aigorv
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 27.04.2010 (Вт) 10:07

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение aigorv » 06.09.2010 (Пн) 13:57

alibek писал(а):
aigorv писал(а):Непонятно тогда, зачем в IE запускается два процесса.

Первый процесс — диспетчер.
Второй и последующие — непосредственно браузеры во вкладках.

Вопрос был риторический.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 06.09.2010 (Пн) 18:43

Получается, что раскладка специфична все-таки для процесса
Чёрт побери, я уже даже текст из msdn привёл, а человек все сотрясает воздух. Если не верите msdn, может поверите своим глазам?
Вложения
Test_Delphi.rar
(202.31 Кб) Скачиваний: 133
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 06.09.2010 (Пн) 20:34

Собственно, вся задача сводится к тому, чтобы найти контрол, имеющий фокус ввода. Активный контрол, расположенный на фореграунд виндоус.
Погуглив интернет понял, что задача нерешаемая. Нигде в похожих темах похожую задачу не решили.
Не туда обращаетесь, не там ищете ;) Малость поуниверсалил предыдущий пример, сделал всё покрасивше. Готовое решение этого годового топика.

ЗЫ. Оптимизацией не занимался, увольте. :)
Вложения
Test_Delphi.rar
(202.22 Кб) Скачиваний: 158
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 07.09.2010 (Вт) 9:01

Эм... Странно. На Windows Seven все прекрасно работает. А вот сейчас запустил на XP и вижу, что специфичность раскладки для потока куда-то делась :)
Надо будет с этим подробнее разобраться.

ADD: Точнее, картина следующая:

Запускаю свой пример, язык по умолчанию - EN. Меняю раскладку на RU и давлю на кнопочку "Создать окно в другом потоке". Окно создается, раскладка в нём - EN. Т.е. всё нормально, у каждого потока своя раскладка.
Однако если же создать окно сразу после запуска, не меняя раскладки, то вот тогда она оказывается одинаковой для всех потоков в процессе. Ну, по крайней мере так говорит Punto Switcher и мой код.

У всех наблюдается такой же эффект?

ADD: Похоже на то, что у всех. Только что проверил на еще одной машине.
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение arthur2 » 07.09.2010 (Вт) 18:05

Twister писал(а):Готовое решение этого годового топика.

А по-моему, готовое решение - в двух моих ответах :oops:
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 08.09.2010 (Ср) 7:05

arthur2 писал(а):А по-моему, готовое решение - в двух моих ответах :oops:
Ну, никто и не спорит, что ключ к решению проблемы - функция GetGUIThreadInfo. Но ты же сам видишь, что некоторые под немного неверным углом смотрели на задачу, точнее на нюансы её решения. И если бы некоторые продолжали думать, что раскладка специфична для процесса, то верное решение выдали бы не скоро.
Так же замечу, что "Ноль передавай" никак не является верным направлением использования этой функции в контексте данной задачи, ибо ноль - "синоним" TID'а текущего потока, а нафига нам только текущий поток? Нам нужно универсальное решение. :)
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение arthur2 » 08.09.2010 (Ср) 18:56

Twister писал(а):а нафига нам только текущий поток? Нам нужно универсальное решение.
В контексте задачи - нам нужно узнать раскладку у активного окна, то есть как раз у текущего потока, или нет?
Twister писал(а):Ну, никто и не спорит, что ключ к решению проблемы - функция GetGUIThreadInfo

Если же мы пытаемся-таки получить универсальное решение и узнать раскладку в программе, которая без фокуса, то GetGUIThreadInfo нам ничем не поможет. Для неё нам нужен тид, а если тид известен, то она сама нам уже и не нужна.
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: KeyboardLayout аналогично раскладке стороннего приложени

Сообщение Twister » 09.09.2010 (Чт) 6:57

arthur2 писал(а):В контексте задачи - нам нужно узнать раскладку у активного окна, то есть как раз у текущего потока, или нет?

Да нет конечно. Как связаны активное окно и текущий поток?

arthur2 писал(а):Если же мы пытаемся-таки получить универсальное решение и узнать раскладку в программе, которая без фокуса, то GetGUIThreadInfo нам ничем не поможет. Для неё нам нужен тид, а если тид известен, то она сама нам уже и не нужна.
Что-то куда-то ты не туда полез. Нам абсолютно неважно в каком окне получать раскладку, неважно - активное оно или нет. Зная нужный hWnd, мы всегда сможем получить ID потока, к которому оно принадлежит и воспользоваться GetGUIThreadInfo. Воспользовавшись ею, мы узнаем hWnd окна, имеющего фокус ввода и оно НЕ ОБЯЗАТЕЛЬНО будет принадлежать этому же потоку. Т.е. подчёркнутое мной выражение в твоей цитате в корне неверно.

Ты в код примера смотрел вообще?
А я все практикую лечение травами...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList