Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45

Событие Form_Deactivate не отрабатывает!

21.11.2022, 20:15. Показов 1585. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго вечера. Помогите, споткнулся на ровном месте. Нужно по событию Form_Deactivate вернуть язык ввода на предыдущий, который сохраняю немного раньше в событии Form_Activated

Вот тут сохраняю текущий язык ввода в переменную PrevCurrInputLanguage:
C#
1
2
3
4
private void Form1_Activated(object sender, EventArgs e)
        {
            PrevCurrInputLanguage = InputLanguage.CurrentInputLanguage;                      
        }
Здесь устанавливаю, нужный:
C#
1
2
3
4
private void txtMessage_MouseClick(object sender, MouseEventArgs e)
        {            
            InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new System.Globalization.CultureInfo("ru-RU"));
        }
Здесь пытаюсь вернуть язык, который был сначала:
C#
1
2
3
4
 private void Form1_Deactivate(object sender, EventArgs e)
        {
            InputLanguage.CurrentInputLanguage = PrevCurrInputLanguage;
        }
Запутался в трех строчках! Любой другой обработчик срабатывает нормально - MouseDoubleClick, ButtonClick и т. д. Не работает только FormDeactivate. В чем может быть дело?

Добавлено через 46 минут
Может событие Form_Deactivate в главной форме какое-то особенное? Ребят, неужели нет никаких версий?! В любом другом событии эта строка срабатывает.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2022, 20:15
Ответы с готовыми решениями:

DispatcherTimer не отрабатывает событие EventHandler
Добрый день, форумчане. Есть небольшая проблема с DispatcherTimer. По какой то непонятной причине не отрабатывается EventHandler с...

Не отрабатывает событие в DataGridView
Добрый день! По непонятным пока причинам игнорируется событие у DataGridView, но только одно их трех (на данный момент), а именно...

Не отрабатывает событие CellValueChanged
Хочу проверять значение введенного в клетку значения, чтобы оно не было меньше 1 Но прописанное в CellValueChanged не срабатывает...

23
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
22.11.2022, 17:04  [ТС]
Ребята, ну неужели никто не подскажет, в чем фишка?! Есть еще одно наблюдение - если перед строкой изменения языка ввода в обработчике Form_Deactivate вызвать MessageBox.Show(), то после закрытия месседжа, язык все-таки меняется. Это магия какая-то просто!
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
22.11.2022, 18:16
bhl777, Так нужно?
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
        InputLanguage TempLanguage;
        bool IsActive;
        private void Form1_Load(object sender, EventArgs e)
        {
            //Сохраняем язык в переменную при первом запуске
            TempLanguage = InputLanguage.FromCulture(new System.Globalization.CultureInfo("fr-FR"));
            Debug.WriteLine("Form1_Load " + TempLanguage.LayoutName);
        }
        private void Form1_Activated(object sender, EventArgs e)
        {
            if (IsActive)
            {
                InputLanguage.CurrentInputLanguage = TempLanguage;
                IsActive = false;
            }
            else
                //Задаем язык английский
                InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new System.Globalization.CultureInfo("en-US"));
 
 
            Debug.WriteLine("Form1_Activated " + InputLanguage.CurrentInputLanguage.LayoutName);
        }
 
        private void Form1_Deactivate(object sender, EventArgs e)
        {
            //Задаем язык русский
            InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new System.Globalization.CultureInfo("ru-RU"));
            Debug.WriteLine("Form1_Deactivate " + InputLanguage.CurrentInputLanguage.LayoutName);
        }
        private void TextBox1_MouseClick(object sender, MouseEventArgs e)
        {
            //Восстанавливаем изначальный Французский
            IsActive = true;
            Form1_Activated(null, null);
 
        }
Добавлено через 36 секунд
В вывод данных смотрите при отладке, что у вас показывает.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
22.11.2022, 19:06  [ТС]
Спасибо! Но не помогло! Я уже пробовал анализировать происходящее с помощью MessageBox. Дело в том, что судя по сообщениям вывода, язык меняется, но фактически раскладка не меняется, и значок языка в панели задач тоже не меняется, естественно. Чудеса продолжаются...
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
22.11.2022, 19:09
bhl777, У меня все меняется и отображает раскладку, почему у вас так, история умалчивает.
1
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
22.11.2022, 20:22  [ТС]
Kazbek17, я в полном отчаянии! Сейчас дома за другим компьютером, создал чистое приложение WinForm, вставил только ваш код. Для чистоты эксперимента даже добавил Французскую раскладку ). Не работает!!! Срабатывают все обработчики: Form1_Load, Form1_Activated, textBox1_MouseClick - меняют раскладку и значок в панели задач. Все! Все, кроме Form1_Deactivate... При этом когда кликаешь за пределами формы, явно обработчик срабатывает, и в окне вывода язык якобы меняется, но по факту раскладка остается последней, которая была выбрана в других обработчиках событий формы. Исключительное что-то ...

Добавлено через 10 минут
Народ, помогите! Пожалуйста, попробуйте еще кто-нибудь у себя. Это 3 минуты займет. Может в Framework дело? у меня на 4.7.2 нацелено, win 10. Задолбался уже немного...
0
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
22.11.2022, 21:44
Цитата Сообщение от bhl777 Посмотреть сообщение
Пожалуйста, попробуйте еще кто-нибудь у себя
Я лично отлаживал ваш код, и у меня
C#
1
InputLanguage.CurrentInputLanguage =
То давало результат, то нет. Причин не знаю
0
fly
 Аватар для I can
4953 / 4641 / 844
Регистрация: 13.04.2015
Сообщений: 9,834
22.11.2022, 22:52
Цитата Сообщение от bhl777 Посмотреть сообщение
окне вывода язык якобы меняется, но по факту раскладка остается последней
Есть разница между языком клавиатуры в приложении и в системе.

Добавлено через 8 минут
Я лет 8 назад занимался подобной проблемой, подробности уже помню смутно. Но для корректной смены языка клавиатуры пришлось использовать винапи функцию ActivateKeyboardLayout
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
23.11.2022, 10:14  [ТС]
brian778, В моем случае результат как раз стабильный - во всех случаях это срабатывает, кроме одного!

Добавлено через 3 минуты
Меня бы даже устроило, если бы внутри приложения язык менялся, как мне надо. Но по факту, этого не происходит, он не меняется ни в системе ни в приложении. Но больше всего удручает, что эта строчка срабатывает везде, кроме единственного места, как будто это событие (Form1_Deactivate) чем-то радикально отличается от всех остальных
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
23.11.2022, 10:25
Цитата Сообщение от bhl777 Посмотреть сообщение
Но по факту, этого не происходит
А можно несколько наводящих вопросов:
1. как Вы убеждаетесь, что языковые настройки не изменяются?
2. проверочный вывод в событии Deactivate наблюдаете?
3. Вы понимаете, что InputLanguage меняет языковые настройки потока приложения, а не системы?
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
23.11.2022, 10:52  [ТС]
Uswer,

1. Я проверяю язык ввода самым наглядным образом, ввожу текст где-то за пределами приложения.
2. Проверочный вывод события показывает, что язык изменяется, но по факту этого не происходит.
3. Возможно. Но почему тогда остальные события работают как мне нужно, и меняют язык где и когда мне нужно?!

Добавлено через 13 минут
Ничего не остается попробовать вызывать смену языка через WinAPI. Наверное действительно, вы правы. Когда срабатывает Form_deactivate, язык переключается только внутри самого приложения. Но почему тогда, если я снова переведу фокус на приложение, он все равно не тот, на который якобы внутри него самого он переключился?!. И почему все-таки во всех других местах он переключает раскладку и в приложении и в системе? Вопросов не меньше, короче...
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
23.11.2022, 10:55
Цитата Сообщение от bhl777 Посмотреть сообщение
Но почему тогда остальные события работают как мне нужно, и меняют язык где и когда мне нужно?!
То есть Вы хотите сказать, что изменив язык в обработчике клика кнопки меняется язык и в других приложениях, например в проводнике? Абсурд!
Попробуйте сделать так: закомментируйте изменение языковых настроек везде кроме обработчиков событий клика одной из кнопок и Deactivate. Причём по клику кнопки устанавливайте вполне конкретный язык ввода, например французский, а в Deactivate например немецкий, при этом желательно чтобы основные языки системы не пересекались с этими, например были заданы русский и английский. Откройте любое другое приложение, например проводник или блокнот. Запустите ваше приложение и проконтролируйте, что система установила язык ввода по умолчанию, например русский. Кликните по кнопке и убедитесь, что язык ввода изменён на французский. Переключитесь на проводник, зафиксируйте язык ввода в нём. Переключитесь на ваше приложение и проверьте язык ввода, он должен быть немецким.

Добавлено через 1 минуту
Цитата Сообщение от bhl777 Посмотреть сообщение
Ничего не остается попробовать вызывать смену языка через WinAPI.
Зачем??? Система это делает сама.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
23.11.2022, 11:35  [ТС]
Uswer, я не поленился и сделал именно так, как вы предложили. Похоже я вынужден вас разочаровать, но действительно при активации любого события в моем приложении, в котором я меняю установку языка, он меняется и за пределами моего приложения, и я ввожу в блокноте текст на том языке, который установил в своей программе. Но по-прежнему, при переключении на другое приложение, например, когда я переключаюсь в блокнот, язык не меняется, на тот, который я указал в событии Form_Deactivate.

НО! Сейчас внимание! Все, что мы здесь так долго обсуждали, работает прекрасно на Win7!
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
23.11.2022, 12:02
Цитата Сообщение от bhl777 Посмотреть сообщение
Похоже я вынужден вас разочаровать
Я разочарован потому, что так быть не должно.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
24.11.2022, 11:17  [ТС]
Народ, кто-то может все-таки помочь? Неужели ни разу, ни у кого не стоял вопрос - поменять язык в своей программе, а при смене фокуса на другое, приложение вернуть язык на первоначальный? Не ожидал, что такая задача окажется неразрешимой. Напомню, что на Win7 этот код работает прекрасно, а на Win10 нет. Я в тупике.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,691
Записей в блоге: 2
24.11.2022, 17:09
Лучший ответ Сообщение было отмечено bhl777 как решение

Решение

Цитата Сообщение от bhl777 Посмотреть сообщение
Народ, кто-то может все-таки помочь? Неужели ни разу, ни у кого не стоял вопрос - поменять язык в своей программе, а при смене фокуса на другое, приложение вернуть язык на первоначальный? Не ожидал, что такая задача окажется неразрешимой. Напомню, что на Win7 этот код работает прекрасно, а на Win10 нет. Я в тупике.
Можно я поучаствую? Люблю дурацкие задачи.

Уточняющий вопрос: вы в своей программе меняете язык на Русский, потом переключаетесь на Блокнот и... Нужно чтобы он назад сменил на Английский?
Если да, то вопросы:
- смена языка в приложении, но почему это должно глобально то влиять?
- в Вин10 есть опция, которая управляет сменой языка в разных приложениях. То есть можно сделать чтобы выбор был единый на всё, а можно чтобы в разных приложениях свой (у меня например так, чтобы не менять языки при переключении с чата на студию например).

Теория.
InputLanguage.CurrentInputLanguage Свойство на то и Current чтобы в текущем потоке меняться. А если нужно иное, то может быть глянуть на InputLanguage.DefaultInputLanguage Свойство?
2
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
24.11.2022, 18:06  [ТС]
HF, добрый день. Спасибо за ваш отклик! Суть проста, пользователь работает за компьютером, при активации окна моего приложения, его текущая раскладка запоминается, а в моем приложении принудительно устанавливается на русский. Далее при при сворачивании или потери фокуса главного окна моей программы, нужно вернуть язык, который был, до активации окна моей программы. Вот вся задача.

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

Цитата Сообщение от HF Посмотреть сообщение
в Вин10 есть опция, которая управляет сменой языка в разных приложениях.
Подскажите где такая? Вроде не натыкался.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,691
Записей в блоге: 2
24.11.2022, 18:20
Цитата Сообщение от bhl777 Посмотреть сообщение
Подскажите где такая? Вроде не натыкался.
Start > Settings > Time & Language > Region & language > Additional date, time & regional settings > (under Language) Change input methods > Advanced settings > (under switching input methods) Check on "Let me set a different input method for each app window"

Добавлено через 2 минуты
Цитата Сообщение от bhl777 Посмотреть сообщение
нужно вернуть язык, который был, до активации окна моей программы. Вот вся задача.
Мне кажется что посыл добрый, но с технической точки зрения вы сами ищете себе сложностей.

1. Проверьте свойство с именем Default*. Оно близко к глобальному.
2. И мне кажется что такое в итоге придётся делать через WinAPI, так как это будет намного ближе к системным вызовам.
1
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
24.11.2022, 19:10
Цитата Сообщение от bhl777 Посмотреть сообщение
я не поленился и сделал именно так, как вы предложили.
Я тоже не поленился и сделал, но у меня ничего подобного не происходит и поведение языковых настроек предсказуемое. Испытание специально проводилось на Win7.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 45
24.11.2022, 19:41  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Я тоже не поленился и сделал, но у меня ничего подобного не происходит
Uswer, я уже писал, что под Win7 у меня тоже все ОК. Проблема только с Win10.

Цитата Сообщение от HF Посмотреть сообщение
Проверьте свойство с именем Default*. Оно близко к глобальному.
Здесь я не совсем вас понял. )

Добавлено через 22 минуты
HF, спасибо огромное!

Цитата Сообщение от HF Посмотреть сообщение
Start > Settings > Time & Language > Region & language > Additional date, time & regional settings > (under Language) Change input methods > Advanced settings > (under switching input methods) Check on "Let me set a different input method for each app window"
Установка галочки, решила все мои проблемы. Потеря формой фокуса теперь меняет язык на который мне нужно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2022, 19:41
Помогаю со студенческими работами здесь

Не отрабатывает событие Change
Не отрабатывает событие $('#myID').change(function() { alert('!!!'); }); Пробовал и через класс обратиться ...

Почему не отрабатывает событие мыши ?
Снова здравствуйте, опять беда-печаль. Мучаюсь с событиями мыши. Общая идея такая, на сцене (QGraphicsScene) рисую пиксельные объекты,...

Событие клика отрабатывает несколько раз
Всем привет, создаю динамично элементы(в примере решил сделать статичными) после создания добавляю для каждого из них событие клика, но...

Событие в браузере unload - код не отрабатывает
Что-то я ни одного рабочего примера так и не нашла в сети - вопрос интересен чисто теоретически. Оно вообще работает? Проба кода -...

innerHTML 'забивает' событие (к примеру, ondblclick - отрабатывает один только раз).
Проблема в следующем: innerHTML 'забивает' событие (к примеру, ondblclick - отрабатывает один только раз). Что делать? Есть ли аналоги...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru