Запретить переключение языка для определенных приложений

749
Vasyl Boroviak

У меня проблема случайного переключения языка ввода. Я пробовал много разных настроек, чтобы не делать этого - сменить горячую клавишу, установить программное обеспечение (Key Switcher, Keyboard Ninja, Punto Switcher) ... Но ничего не помогло.

Я привык к определенной горячей клавише (Ctrl + Shift). Любая другая горячая клавиша заставляет меня еще больше страдать. Программное обеспечение, которое я нашел, не имеет функции, позволяющей избежать случайных переключений.

То, что я хочу, - это найти программный продукт, который может привязать язык ввода «Английский США» к моей «Visual Studio». И любые нажатия Ctrl + Shift внутри VS не должны приводить к переключению языка. Есть идеи?

4
Какая версия Windows и какая версия Visual Studio? Кроме того, 32 или 64-разрядный? Hugh Allen 13 лет назад 0
Я работаю с Windows 7 и VS2008 (скоро переключится на VS2010). Все 64бит. Vasyl Boroviak 13 лет назад 0
Вы решили эту проблему? У меня та же проблема ... alexeit 12 лет назад 0
Нет, я не Vasyl Boroviak 12 лет назад 0
это 2014, на улице есть летающие роботы, но мы до сих пор не можем это решить. все еще нет решения? vorou 9 лет назад 0

3 ответа на вопрос

1
harrymc

Если вы перейдете на
Control Panel / Regional and Language Options / Languages / Details / Key Settings
страницу, то обнаружите, что вы можете определить горячие клавиши для смены языка.

Вы можете связать это с языком макросов, таким как AutoHotkey, чтобы определить макрос, который изменяет язык / раскладку клавиатуры, а затем запускает Visual Studio. Это, однако, не будет блокировать будущие изменения языка.

Если вы ищете что-то более строгое, насколько я знаю, такой программы не существует. Поскольку VS расширяемый, вы можете запрограммировать себя надстройку, которая ограничит количество языков, разрешенных для VS. Эта небольшая надстройка будет загружаться с VS и устанавливать для предпочитаемых языков только один (английский).

Если вы хотите запустить себя в этом направлении, для начала могут быть полезны следующие ссылки:


Учебник по поддержке языковых параметров приложения : создание надстроек Visual Studio Создание надстроек
Visual Studio

Да уж. Удалите все горячие клавиши переключения языка и оставьте только индикаторы на панели задач. Таким образом, вы не можете случайно переключиться. Loren Pechtel 13 лет назад 0
0
Daisetsu

Пока ваш язык по умолчанию уже установлен, и вам нужно изменить язык только для одной программы, я бы предложил изменить язык для этой программы (VS), а затем перейти к настройкам языка и изменить горячую клавишу на none, а затем перейти к последовательность клавиш и снимите этот флажок (Региональные и языковые параметры -> вкладка Языки -> подробности -> Настройки клавиш -> Изменить последовательность клавиш). Теперь ярлыки будут отключены, и, поскольку Windows запоминает входные данные для каждого приложения, вход автоматически переключается на VS, но остается испанским для всего остального.

Нету. Это не решение. Дело в том, что я должен использовать оба языка во всех других приложениях (таких как браузер, почтовый клиент или скайп). Vasyl Boroviak 13 лет назад 0
0
Hugh Allen

Следующее работает в Visual Studio .NET 2003 на 32-битной WinXP. YMMV.

  • Файл -> Новый проект
  • выберите тип проекта: другие проекты \ расширяемые проекты
  • выберите шаблон: надстройка Visual Studio .NET. Нажмите ОК.
  • нажмите Далее, выберите Создать надстройку с использованием Visual C ++ / ATL, нажмите Далее.
  • выберите все возможные хосты приложения, нажмите Next.
  • (опционально) введите имя и описание, нажмите Далее.
  • выберите Параметры. Не проверяйте «да, создайте пункт меню Инструменты». Нажмите кнопку "Далее.
  • не выбирайте создавать окно About. Нажмите кнопку "Далее.
  • нажмите Готово.
  • перейти на вкладку с исходным файлом Connect.cpp
  • вверху, после #includes добавить строку

    HHOOK myhook; 
  • к методу CConnect::OnConnectionдобавить строку

    myhook=SetWindowsHookEx(WH_GETMESSAGE, &myGetMsgProc, _AtlModule.GetResourceInstance(), GetCurrentThreadId()); 
  • к методу CConnect::OnDisconnectionдобавить строку

    UnhookWindowsHookEx(myhook); 
  • выше OnConnection()добавить функцию

    LRESULT CALLBACK myGetMsgProc(int code, WPARAM wParam, LPARAM lParam) { MSG *msg = (MSG*)lParam; if (code>=0 && msg->message==WM_INPUTLANGCHANGEREQUEST) msg->message = WM_NULL; return CallNextHookEx(myhook, code, wParam, lParam); } 
  • построить решение.
  • выберите меню Инструменты -> Диспетчер надстроек ...
  • установите флажок для вашей новой надстройки. Не проверяйте «Запуск» на данный момент, если что-то пошло не так - вы не хотите, чтобы Visual Studio аварийно завершала работу при каждом запуске!
  • нажмите ОК

Теперь невозможно изменить язык или раскладку клавиатуры в Visual Studio. Языковая панель немного запутывается, если вы пытаетесь, но не ломается.

Я сделал все шаги. Все прошло нормально. За исключением переключения языка все еще происходит. :( Vasyl Boroviak 13 лет назад 0
Черт. Мой код предполагает, что поток, который загружает надстройку, является потоком, в котором размещается графический интерфейс, что может быть неверно в вашей версии VS. Не могли бы вы выяснить, в этом ли проблема? Один из способов заключается в том, чтобы поместить вызов MessageBox () в OnConnection, чтобы показать текущий идентификатор потока, и использовать Spy ++ в окне редактора кода, чтобы найти его идентификатор потока. Hugh Allen 13 лет назад 0
У меня просто возникла другая мысль - ты действительно пытался печатать после переключения языков или ты просто поверил тому, что сказала тебе языковая панель? Hugh Allen 13 лет назад 0
Я печатал, конечно. :) И перезагрузил VS на всякий случай. Я попробую идею нити через два дня. Благодарю. Vasyl Boroviak 13 лет назад 0
@Vasiliy Borovyak: "попробуй идею темы через два дня" ... но награда заканчивается через 2 дня :( Hugh Allen 13 лет назад 0
@Vasiliy Borovyak: если вы надеетесь вернуть свои 100 очков репутации, не начисляя награду, это не сработает - прочтите FAQ. Вы также потеряете способность принять ответ на этот вопрос. Hugh Allen 13 лет назад 0
Мне не нужно никаких очков. :) Мне нужна функция в моем VS! И не волнуйся. Достаточно времени, чтобы попытаться дать вам награду. :) Vasyl Boroviak 13 лет назад 0
MessageBox требует некоторых параметров. Я не знаю, что мне там писать. И что я должен #include, чтобы получить идентификатор потока? Пожалуйста, предоставьте код, чтобы сделать это. Vasyl Boroviak 13 лет назад 0
Ложная сигнализация! Я погуглил весь код, который мне нужен. Результат следующий. MessageBox показывает `ID потока: 2724`. PID devenv.exe - это тот же `2724`. :( Также мой VS2008 сошел с ума! Окно сообщений показывается в бесконечном цикле. Вероятно, OnConnection - не лучшее место для отображения окон сообщений. Vasyl Boroviak 13 лет назад 0
@Vasiliy Borovyak: «Вероятно, OnConnection - не лучшее место для отображения окон сообщений». Согласен. Вы действительно должны использовать OutputDebugString (), но для просмотра его результатов вам потребуется либо отладчик, подключенный к VS (например, второй экземпляр VS), либо использовать DebugView от Sysinternals: http://technet.microsoft.com /en-us/sysinternals/bb896647.aspx Hugh Allen 13 лет назад 0
@Vasiliy Borovyak: «Идентификатор потока: 2724. PID devenv.exe - это тот же 2724» Это кажется слишком большим совпадением. Вы уверены, что TID == PID ?? А вы использовали Spy ++, чтобы узнать TID, которому принадлежит главное окно редактора? (Примечание: TID и PID VS будут отличаться при каждом запуске - я просто хочу знать, является ли TID, который вызывает OnConnection, тем, которому принадлежит GUI) Hugh Allen 13 лет назад 0
Ты прав. Я использовал функцию `getpid ()`. Таким образом, я изменил вызов GetCurrentThreadId (), и он показывает 2200. Использование Spy ++ в редакторе показало 0x898 (это то же самое, что 2200). Так что тема такая же. Vasyl Boroviak 13 лет назад 0
@Vasiliy Borovyak: В таком случае я не знаю, почему это не работает для вас. Я не могу проверить / отладить его сам, потому что у меня VS2003 на 32-битной XP, и он работает для меня. Возможно, вместо этого вы могли бы найти способ выгрузить msctf.dll (которая реализует горячую клавишу) из процесса VS. Возможно, попробуйте 64-битную альфа-версию Unlocker: http://ccollomb.free.fr/unlocker/ Hugh Allen 13 лет назад 0
Выгрузить .dll из VS? Кажется, орехи подходят. :) Я не собираюсь этого делать, потому что это слишком сложно. Спасибо, в любом случае. Vasyl Boroviak 13 лет назад 0
@ Василий Боровяк: Верно. Выгрузка DLL только приводит к сбою VS :) Вы можете попробовать вызвать SetProcessPreferredUILanguages, но похоже, что это для языков GUI, а не для языков ввода. Также я не могу написать код для вас, так как у меня нет Win7. Документы на http://msdn.microsoft.com/en-us/library/dd374050%28v=VS.85%29.aspx Hugh Allen 13 лет назад 0