Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 05.11.2011
Сообщений: 14
1
.NET 4.x

Не во всех программах определяется язык ввода

20.02.2014, 09:43. Показов 1006. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Подскажите, пожалуйста, у меня лыжи не той системы или это виндовс такой классный?

В одном приложении, пользуюсь небезызвестной конструкцией, чтобы определять язык ввода

C#
1
2
3
4
5
6
IntPtr handle = GetForegroundWindow();
int WinThreadProcId = GetWindowThreadProcessId(handle, out _ProcessId);
IntPtr KeybLayout = GetKeyboardLayout(WinThreadProcId);
if (KeybLayout.ToString() == "67699721")  {}      //eng
 
if (KeybLayout.ToString() == "68748313") {}   //rus
в целом, работает исправно. Но есть странный нюанс. Например если в Outlook-е тыкаешь по ссылке, которая открывается в браузере, то раскладка браузера уже неправильно определяется. Т.е. child не отрабатывается.

И в консольных программах (cmd, far итд) определение не работает всегда, с любой раскладкой определяет 67699721.
Куда можно копнуть?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2014, 09:43
Ответы с готовыми решениями:

Русский язык в некоторых программах не отображается
Проблемы с русским языком в некоторых программах Место русского пишет ну что то типа такого(см....

Не воспринимается русский язык в отдельных программах
Установил Disciple на русском языке, уже начиная с установки, русский в игрушке не воспринимается...

Казахский язык в программах отображается не правильно
Здравствуйте. Делаю простенькую прогу для печати документов. Столкнулся с проблемой ввода...

Во всех программах для записи видео плохая картинка во всех играх + сильно смазывает картинку
Во всех программах для записи видео (такие как geforce experence и obs) плохая картинка во всех...

4
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.02.2014, 01:17 2
медведко,
C#
1
2
3
if (KeybLayout.ToString() == "67699721")  {}      //eng
 
if (KeybLayout.ToString() == "68748313") {}   //rus
за такой код обычно по голове не гладят... Объявите нормальные константы... А лучше словарь. А уж зачем приводить int в строку, а затем сравнивать её со строковым эквивалентом другого числа вообще загадка для меня...

Что касается остального, тут это обсуждалось:
GetKeyboardLayout() всегда возвращает ангийскую раскладку

Добавлено через 7 минут
медведко, дарю:
C#
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
 string GetLayoutName(IntPtr layout)
        {
            switch (layout.ToInt32())
            {
            case 68748313:
                return "Русская раскладка";
            case 67699721:
                return "Английская (США) раскладка";
            case 68944924:
                return "Албанская раскладка";
            case 67701769:
                return "Английская (Австралия) раскладка";
            case 134809609:
                return "Английская (Великобритания) раскладка ";
            case 403249161:
                return "Английская (Ирландия) раскладка";
            case 269029385:
                return "Английская (Канада) раскладка";
            case 604578825:
                return "Английская (Карибский) раскладка";
            case 67703817:
                return "Английская (Новая Зеландия) раскладка";
            case 67705865:
                return "Английская (Южная Африка) раскладка";
            case 537468937:
                return "Английская (Ямайка) раскладка";
            case 67699766:
                return "Африкаанса раскладка";
            case 70059053:
                return "Бакская раскладка";
            case 69403683:
                return "Белорусская раскладка";
            case 67240962:
                return "Болгарская раскладка";
            case 68027406:
                return "Венгерская раскладка";
            case 135464979:
                return "Голландская (Бельгия) раскладка";
            case 68355091:
                return "Голландская (стандартная) раскладка";
            case 67634184:
                return "Греческая раскладка";
            case 67503110:
                return "Датская раскладка";
            case 67699745:
                return "Индонезийская раскладка";
            case 68092943:
                return "Исландская раскладка";
            case 738864138:
                return "Испанская (Аргентина) раскладка";
            case 1074413578:
                return "Испанская (Боливия) раскладка";
            case 537534474:
                return "Испанская (Венесуэла) раскладка";
            case 269094922:
                return "Испанская (Гватемала) раскладка";
            case 1208633354:
                return "Испанская (Гондурас) раскладка";
            case 470424586:
                return "Испанская (Доминиканская республика) раскладка";
            case 604644362:
                return "Испанская (Колумбия) раскладка";
            case 336204810:
                return "Испанская (Коста-Рика) раскладка";
            case 134875146:
                return "Испанская (Мексиканская) раскладка";
            case 1275743242:
                return "Испанская (Никарагуа) раскладка";
            case 403314698:
                return "Испанская (Панама) раскладка";
            case 1007303690:
                return "Испанская (Парагвай) раскладка";
            case 671754250:
                return "Испанская (Перу) раскладка";
            case 1342853130:
                return "Испанская (Пуэрто-Рико) раскладка";
            case 1141523466:
                return "Испанская (Сальвадор) раскладка";
            case 201985034:
                return "Испанская (современная сортировка) раскладка";
            case 67765258:
                return "Испанская (традиционная) раскладка";
            case 940193802:
                return "Испанская (Уругвай) раскладка";
            case 873083914:
                return "Испанская (Чили) раскладка";
            case 805974026:
                return "Испанская (Эквадор) раскладка";
            case 68158480:
                return "Итальянская (стандартная) раскладка";
            case 68159504:
                return "Итальянская (Швейцария) раскладка";
            case 67306499:
                return "Каталанский раскладка";
            case 69600294:
                return "Латышский раскладка";
            case 69665831:
                return "Литовский раскладка";
            case 70190127:
                return "Македонский (FYROM) раскладка";
            case 67570695:
                return "Немецкая (Австрия) раскладка";
            case 67572743:
                return "Немецкая (Линхтейштейн) раскладка";
            case 67571719:
                return "Немецкая (Люксембург) раскладка";
            case 67568647:
                return "Немецкая (стандартная) раскладка";
            case 134678535:
                return "Немецкая (Швейцария) раскладка";
            case 68420628:
                return "Норвежская (букмол) раскладка";
            case 135530516:
                return "Норвежская (нюнорск) раскладка";
            case 68486165:
                return "Польская раскладка";
            case 68551702:
                return "Португальская (Бразилия) раскладка";
            case 135661590:
                return "Португальская (стандартная) раскладка";
            case 68682776:
                return "Румынская раскладка";
            case 203033626:
                return "Сербская раскладка";
            case 68879387:
                return "Словацкая раскладка";
            case 69469220:
                return "Словенская раскладка";
            case 69141535:
                return "Турецкая раскладка";
            case 69338146:
                return "Украинская раскладка";
            case 70779960:
                return "Фарерских островов раскладка";
            case 67830795:
                return "Финская раскладка";
            case 135006220:
                return "Французская (Бельгия) раскладка";
            case 202116108:
                return "Французская (Канада) раскладка";
            case 67900428:
                return "Французская (Люксембург) раскладка";
            case 67896332:
                return "Французская (стандартная) раскладка";
            case 269225996:
                return "Французская (Швейцария) раскладка";
            case 68813850:
                return "Хорватская раскладка";
            case 67437573:
                return "Чешская раскладка";
            case 69010461:
                return "Шведская раскладка";
            case 69534757:
                return "Эстонская раскладка";
            default:
                return "Неизвестная раскладка";
            }
        }
0
1 / 1 / 0
Регистрация: 05.11.2011
Сообщений: 14
22.02.2014, 06:32  [ТС] 3
К сожалению, в данной теме ответ
"а вот ИЕ(например) анг возвращает там надо глубже копнуть перед тем как раскладку определять"
мягко говоря, не приблежает к решению Я и сам понимаю, что надо глубже копнуть.
Если с потоками более-менее объяснимо, видимо надо ещё и активный поток найти. Но почему консоль всегда дефолтную раскладку возвращает - совсем неясно.

По лишним перекодировкам в string спасибо, учту. Португальский, албанский и прочее в нашей конторе не используется, так что смысла нет. Проще будет в случае чего ещё одну добавить.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.02.2014, 11:36 4
медведко, ну гуглить придется, я ответа точно также не знаю, что знал - сказал.

По лишним перекодировкам в string спасибо, учту. Португальский, албанский и прочее в нашей конторе не используется, так что смысла нет. Проще будет в случае чего ещё одну добавить.
Один раз написали, запихнули в отдельный статический класс и забыли про его существование ?..

C#
1
static string GetLayoutName(this IntPtr layout)
а потом в коде:

C#
1
string name = GetKeyboardLayout(WinThreadProcId).GetLayoutName();
как будто лишние 2кб текста в коде сильно напрягают...
0
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4
16.05.2014, 12:11 5
Здравия желаю. Всё ещё эпизодически возвращаюсь к данной проблеме

Стало понятно, с помощью spy++, что в IE разные потоки обслуживают разные поля ввода, а GetForegroundWindow возвращает всегда то, что с URL.

Прикрутил, вроде как, GetGUIThreadInfo и теперь определяю handle нужного треда. Через spy++ проверил, что это номера реальных потоков IE. Но почему-то теперь GetKeyboardLayout всегда возвращает ноль вместо раскладки этого потока.

Что делать, как быть?


C#
1
2
3
4
5
6
7
8
        static IntPtr GetFocusedHandle()
        {
            var info = new GuiThreadInfo();
            info.cbSize = Marshal.SizeOf(info);
            if (!GetGUIThreadInfo(0, ref info))
                throw new Win32Exception();
            return info.hwndFocus;
        }
Добавлено через 57 минут
Усё, победил (топикстартер это я).
Общеизвестный код из первого сообщения кривой

Правильно это:
выяснить handle потока имеющего ввод с помощью GetGUIThreadInfo (а не GetForegroundWindow)
потом с помощью GetWindowThreadProcessId выяснить handle потока-родителя
и уже на этот handle натравливать GetKeyboardLayout

Если второй шаг не сделать, то возвращает вместо раскладки ноль.

Я думаю, такое злое разбиение на потоки полей ввода не только в IE бывает, но и в любой более-менее сложной программе.
0
16.05.2014, 12:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2014, 12:11
Помогаю со студенческими работами здесь

Как перейти на русский язык в Dos'овских программах?
Проблемы с переходом на русский язык в Dos'овских программах! Подскажите кто че знает!...

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

Ошибки 0xc0000005 почти на всех программах
Предистория: решил сменить антивирус 360 Total Security на Аваст, и удалил китайский антивирус и в...

Информация о всех компонентах и установленных программах
Добрый день товарищи! Есть скрипт, он собирает информацию о всех установленных компонентах и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru