Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668

Получить язык ввода для текущего потока

23.01.2024, 21:33. Показов 1332. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Попытаю счастье в этой ветке.
Подскажите пожалуйста если не трудно, почему язык ввода для текущего потока определяется один раз и больше не реагирует на смену раскладки и языка ввода?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace ConsoleApp1
{
    internal class Program
    {
        
        static void Main(string[] args)
        {
            
            InputLanguage myCurrentLanguage = InputLanguage.CurrentInputLanguage;
            while (true)
            {
                Thread.Sleep(100);
                if (myCurrentLanguage != null)
                {
                    Console.WriteLine(myCurrentLanguage.LayoutName);
                    myCurrentLanguage = null;
                }
                
            }
        }
        
    }
}
Добавлено через 35 минут
Проблема решена, нужно выполнять постоянно в новом потоке
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace ConsoleApp1
{
    internal class Program
    {
        static void mythread()
        {
            InputLanguage myCurrentLanguage = InputLanguage.CurrentInputLanguage;
            if (myCurrentLanguage != null)
            {
                Console.WriteLine(myCurrentLanguage.LayoutName);
                myCurrentLanguage = null;
            }
            Thread.Sleep(100);
            Thread thread = new Thread(mythread);
            thread.Start();
        }
        static void Main(string[] args)
        {
            mythread();
        }
        
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2024, 21:33
Ответы с готовыми решениями:

Получить число активных потоков + ID текущего потока при использовании Task.Factory
Вот класс, которым создаю таски. Как я понимаю, создаются они с использованием ThreadPool, значит методы Thread должны работать. ...

Как получить TID текущего потока? (библиотека pthread, компилятор g++ 4.6.1 открытый вопрос niXmanу)
Да, как? #include <windows.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> void *BusyWork(void *t) { ...

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

19
23.01.2024, 21:47

Не по теме:

удалил

0
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
24.01.2024, 00:18
В консоле возможно получить только раскладку по умолчанию и культуру.
Только в форме есть возможность отслеживать переключение.
P.S. а рекуррентный вызов потока очень хорошо забивает память
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 09:00  [ТС]
Цитата Сообщение от roach1967 Посмотреть сообщение
а рекуррентный вызов потока очень хорошо забивает память
Это я потом уже понял.

Добавлено через 58 минут
roach1967, можно освобождать память от предыдущего потока?

Добавлено через 8 минут
roach1967, я так понимаю сборщик мусора поможет?
0
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
24.01.2024, 10:38
VladimirU, везде, где нашёл про раскладку, советовали использовать таймер вместо потока.
Пробовал разные способы, однако в консоли нет возможности отследить смену языка. Только в GUI.

Вот через WinAPI:
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
using System;
using System.Globalization;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Timers;
using Timer = System.Timers.Timer;
 
namespace ConsoleApp4
{
    class Program
    {
        private static Timer tm;
        static void Main(string[] args)
        {
            tm = new Timer();
            tm.Interval = 100;
            tm.Elapsed += Tm_Elapsed;
            tm.Start();
            Console.ReadLine();
            tm.Stop();
            tm.Dispose();
        }
 
        private static void Tm_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine(KeyboardLayouts.GetThreadKeyboardLayout().LanguageName);
        }
 
        public class KeyboardLayout
        {
            public uint Id { get; }
 
            public ushort LanguageId { get; }
            public ushort KeyboardId { get; }
 
            public string LanguageName { get; }
            public string KeyboardName { get; }
 
            internal KeyboardLayout(uint id, ushort languageId, ushort keyboardId, string languageName, string keyboardName)
            {
                Id = id;
                LanguageId = languageId;
                KeyboardId = keyboardId;
                LanguageName = languageName;
                KeyboardName = keyboardName;
            }
        }
 
        public static class KeyboardLayouts
        {
            public static KeyboardLayout GetThreadKeyboardLayout(int threadId = 0)
            {
                uint keyboardLayoutId = (uint)GetKeyboardLayout((uint)threadId);
 
                return CreateKeyboardLayout(keyboardLayoutId);
            }
 
            public static KeyboardLayout GetProcessKeyboardLayout(int processId = 0)
            {
                int threadId = GetProcessMainThreadId(processId);
                return GetThreadKeyboardLayout(threadId);
            }
 
            private static Int32 GetProcessMainThreadId(int processId = 0)
            {
                Process process = 0 == processId ? Process.GetCurrentProcess() : Process.GetProcessById(processId);
                return process.Threads[0].Id;
            }
 
            private static KeyboardLayout CreateKeyboardLayout(UInt32 keyboardLayoutId)
            {
                var languageId = (UInt16)(keyboardLayoutId & 0xFFFF);
                var keyboardId = (UInt16)(keyboardLayoutId >> 16);
 
                return new KeyboardLayout(keyboardLayoutId, languageId, keyboardId, GetCultureInfoName(languageId), GetCultureInfoName(keyboardId));
 
                String GetCultureInfoName(UInt16 cultureId)
                {
                    return CultureInfo.GetCultureInfo(cultureId).DisplayName;
                }
            }
 
            [DllImport("user32.dll")]
            private static extern IntPtr GetKeyboardLayout(uint idThread);
        }
    }
}
И всё равно не работает
0
run
 Аватар для I can
4914 / 4526 / 837
Регистрация: 13.04.2015
Сообщений: 9,656
24.01.2024, 10:52
Цитата Сообщение от VladimirU Посмотреть сообщение
я так понимаю сборщик мусора поможет?
Потребление памяти действительно растёт в начале, потом выравнивается. И число потоков увеличивается до 14, потом так и держится. Очеидно, да - работает сборщик. Тут дело еще в том, что если программа теряет фокус, то перестаёт что-либо определять.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 11:20  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
И число потоков увеличивается до 14, потом так и держится.
Это если запускать в отладчике VS, а если уже с компелированный запустить то число потоков не ограниченно растёт и память засирается. Сейчас гуглю как можно выгружать из памяти потоки но увы однозначно ничего нету.

Добавлено через 16 минут
Цитата Сообщение от roach1967 Посмотреть сообщение
И всё равно не работает
Значит надо понять как сделать сборщик мусора. А если через таски как то сделать?
0
24.01.2024, 11:27

Не по теме:

Цитата Сообщение от VladimirU Посмотреть сообщение
как сделать сборщик мусора
Как-как GC.Collect(); вот как, но из того метода вряд ли сработает.

0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 11:33  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Как-как GC.Collect(); вот как, но из того метода вряд ли сработает.
В Framework 4.8 нету такой возможности.
0
 Аватар для Andrey-MSK
3308 / 2196 / 386
Регистрация: 14.08.2018
Сообщений: 7,387
Записей в блоге: 4
24.01.2024, 11:40
Цитата Сообщение от VladimirU Посмотреть сообщение
В Framework 4.8 нету такой возможности.
Да ладно - GC.Collect()
1
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 11:45  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Да ладно - GC.Collect()
Это не Framework 4.8, а NET платформа никак не связанна с Framework 4.8 для моего проекта не подходит.
0
 Аватар для Andrey-MSK
3308 / 2196 / 386
Регистрация: 14.08.2018
Сообщений: 7,387
Записей в блоге: 4
24.01.2024, 11:47
Цитата Сообщение от VladimirU Посмотреть сообщение
Это не Framework 4.8, а NET платформа никак не связанна с Framework 4.8 для моего проекта не подходит.
Вы внимательно посмотрели картинку? Промотали до конца ссылку? Раскрыли там список?
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 15:19  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вы внимательно посмотрели картинку? Промотали до конца ссылку? Раскрыли там список?
Теперь да увидел спасибо.

Добавлено через 30 минут
Andrey-MSK, конечно метод принудительно собирает мусор но вот сам за собой похоже не хочет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void mythread()
        {
            GC.Collect(2, GCCollectionMode.Forced);
            InputLanguage myCurrentLanguage = InputLanguage.CurrentInputLanguage;
            if (myCurrentLanguage.LayoutName != str)
            {
                str =myCurrentLanguage.LayoutName;
                Console.WriteLine(myCurrentLanguage.LayoutName);
                myCurrentLanguage = null;
            }
            Thread.Sleep(10);
            Thread thread = new Thread(mythread);
            thread.Start();
            
 
        }
Добавлено через 46 секунд
Ладно пока тему можно подвесить на паузу.

Добавлено через 2 часа 55 минут
Но вот что не понятно, насколько я помню в языке Си есть функции API в них можно создавать потоки и получать по возврату функции дескриптор потока, так вот и по этому дескриптору можно ликвидировать поток из памяти полностью, может есть такой способ и в C#?
0
 Аватар для Andrey-MSK
3308 / 2196 / 386
Регистрация: 14.08.2018
Сообщений: 7,387
Записей в блоге: 4
24.01.2024, 15:21
VladimirU, В C/C++ памятью управляешь сам, в NET управление памятью идёт автоматически. Только в режиме unsafe можно что-то напрямую с памятью делать.
1
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 940
Записей в блоге: 5
24.01.2024, 15:30
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
using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleAppForTests
{
    public delegate void KeyboardLayoutHandler(object obj, IntPtr keyboardLayout);
 
    public sealed class KeyboardLayout
    {
        #region Native win32 API
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern IntPtr GetKeyboardLayout(uint idThread);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr processId);
 
        #endregion
 
        public KeyboardLayout()
        {
            GetHandlerKeyboardLayout();
        }
 
        private IntPtr currentKeyboardLayout = IntPtr.Zero;
 
        public IntPtr CurrentKeyboardLayout
        {
            get => currentKeyboardLayout;
            set
            {
                currentKeyboardLayout = value;
                KeyboardLayoutChanged?.Invoke(this, value);
            }
        }
 
        public event KeyboardLayoutHandler KeyboardLayoutChanged;
 
        private void GetHandlerKeyboardLayout()
        {
            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    IntPtr keyboardlayout = GetKeyboardLayout();
 
                    if (CurrentKeyboardLayout != keyboardlayout)
                    {
                        CurrentKeyboardLayout = keyboardlayout;
                    }
 
                    Thread.Sleep(500);
                }
            });
        }
 
        public static IntPtr GetKeyboardLayout()
        {
            IntPtr hWnd = GetForegroundWindow();
            IntPtr processId = IntPtr.Zero;
            uint idThread = GetWindowThreadProcessId(hWnd, processId);
 
            return GetKeyboardLayout(idThread);
        }
 
        public static CultureInfo GetCultureInfo(IntPtr keyboardLayout)
        {
            return new CultureInfo((short)keyboardLayout.ToInt64());
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
namespace ConsoleAppForTests
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var keyboardLayout = new KeyboardLayout();
            keyboardLayout.KeyboardLayoutChanged += OnKeyboardLayoutChanged;
 
            while (true) { }
        }
 
        private static void OnKeyboardLayoutChanged(object sender, IntPtr hKbdL)
        {
            int keyboardLayoutId = KeyboardLayout.GetCultureInfo(hKbdL).KeyboardLayoutId;
 
            Console.WriteLine($"{keyboardLayoutId}. {KeyboardLayout.GetCultureInfo(hKbdL).DisplayName}");
        }
    }
}
2
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
24.01.2024, 16:35  [ТС]
iNNOKENTIY21, компелируется без ошибок но событие не отлавливает.

Добавлено через 29 минут
одно не понятно где вы берёте информацию о содержании функций в user32.dll и как параметры функций Си переводите в параметры методов C#? Справочник что ли есть какой?
0
 Аватар для Andrey-MSK
3308 / 2196 / 386
Регистрация: 14.08.2018
Сообщений: 7,387
Записей в блоге: 4
24.01.2024, 16:55
Цитата Сообщение от VladimirU Посмотреть сообщение
одно не понятно где вы берёте информацию о содержании функций в user32.dll и как параметры функций Си переводите в параметры методов C#? Справочник что ли есть какой?
WinAPI
0
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 940
Записей в блоге: 5
24.01.2024, 17:06
Цитата Сообщение от VladimirU Посмотреть сообщение
одно не понятно где вы берёте информацию о содержании функций в user32.dll и как параметры функций Си переводите в параметры методов C#? Справочник что ли есть какой?
Указатель API Windows - Win32 apps | Microsoft Learn
Ну и google, stackoverflow … https://pinvoke.net/ — который кажись всё, rip Что с сайтом pinvoke.net? - .NET - Киберфорум
https://github.com/dotnet/pinvoke
На новых .Net уже переиграли и там по другому, но за это я уже совсем не в курсе (https://blogs.windows.com/wind... languages/).
0
Эксперт .NET
 Аватар для Wolfdp
3781 / 1755 / 371
Регистрация: 15.06.2012
Сообщений: 6,514
Записей в блоге: 3
27.01.2024, 15:32
Ммм... я не уверен что это надежное решение. Дело в том что консоль оперирует не клавиатурой, а потоком ввода (Stream, который содержится в Console.In). Очень простой пример для понимания: любое(!) консолько приложение можно вызвать так App.exe < in.txt, где файл in.txt -- заранее прописанные команды для ввода. В этом случае у нас метод ввода если и будет детектится, то мало что иметь общего с реальностью.
0
60 / 185 / 31
Регистрация: 14.02.2013
Сообщений: 1,668
28.01.2024, 00:09  [ТС]
Wolfdp, тут проблема в самой C# основанной на C++ а плюсы на чистой си а чистая си на ASM ну и так далее до бинарной системы исчисления. Раньше читал про три кольца всевластия которое придумал толь Бил Гейтс толи его антипод Кевин Метник.

Добавлено через 57 минут
roach1967, а ты вообще как я из племени индейцев южной америки, как вообще выжил, вождь блин.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2024, 00:09
Помогаю со студенческими работами здесь

Получить язык ввода по hWnd
Есть hWnd определенного окна, как получить текущий язык ввода для этого окна? Заранее благодарен.

Как получить данные из потока ввода, пока он не завершён?
Я бы хотел узнать, как можно получить данные из потока ввода(к примеру я идентифицирую массив с помощью cin ), пока он не завершён? То есть...

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя (ubuntu) и добавить этот список в QMenu. И...

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя (ubuntu) и добавить этот список в QMenu. И...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru