web-dev-qa-db-ja.com

Windows10のAlt + Shift切り替えサイクルから入力言語を除外する

システムには、英語、ロシア語、日本語の3つの言語があります。しかし、私はできるようになりたいだけです Alt+Shift 英語とロシア語の間。 Windows 10でそれを行う方法はありますか?

This 質問は、Windows 10では機能しないため、ここでは適用されません。

5
Liburia

次の手順に従います。

  1. インストール AutoHotkey
  2. テキストファイルを作成し、次のテキストを貼り付けます。
; This scripts changes the functionality of Shift + Alt from "switch keyboard layout"
; to "change to previous layout".
; this is usefull when you have more than 2 keyboard layouts and want to switch between 
; only 2 of them.

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

LAlt & LShift::send, #^{space down}{space up}
  1. ファイルを保存して、拡張子。ahkを付けます(例:「ExcludeExtra KeyboardLayouts.ahk」)
  2. ダブルクリックしてスクリプトを実行します。これで、Alt + Shiftは、最初の2つのキーボードレイアウト間でのみ切り替える必要があります。

満足のいく場合は、スクリプトをコンパイルして(右クリック->コンパイル)、。exeファイルを作成できます。次に、。exeまたは。ahkファイルをスタートアップに移動しますフォルダ(RUNを開き、引用符なしで「Shell:startup」と入力します)。

追記:

  • 。exeファイルをコピーすると、AutoHotkeyは不要になるため、アンインストールできます。
  • 。ahkスクリプトファイルをコピーする場合は、AutoHotkeyをアンインストールしないでください。
  • この post は、やや似たような問題を解決し、アイデアを思いつくのに役立ちました。
2
Ewindar

私はおそらく同じオートホットキーソリューションで少し良いアプローチを提案します。

以前のレイアウト(3番目になる可能性があります)に切り替える代わりに、ネイティブのAlt + Shiftサイクリングホットキーを無効にして、独自のレイアウト切り替えロジックに道を譲る方がよいでしょう。

disable example

そして、おそらく必要な調整を加えて、次のスクリプトを使用します。

#SingleInstance force
SendMode Input

; Cycled list of language ids
; refer to https://docs.Microsoft.com/en-us/windows/win32/intl/language-identifiers
; and https://docs.Microsoft.com/en-us/windows/win32/intl/language-identifier-constants-and-strings
; for finding out correct values
; in this case 0x409 means standard US English, and 0x419 means standard Russian
AltShiftLangs := [0x0409, 0x0419]

; 0x411 means japanese IME
CtrlAltLang := 0x0411

; This returns currently active language id
GetKeyboardLayout() {
  WinGet, WinID,, A
  ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0)
  return DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt") & 0xFFFF
}

; This sends request to change system language to lang argument
SetKeyboardLayout(lang) {
  PostMessage, 0x50,, lang,, A
}

; This returns 0-based index of Value in Arr
IndexOf(Arr, Value) {
  Loop % Arr.Length()
    if Arr[A_Index] == Value {
      return A_Index-1
    }
  return -1
}

; This sets language based on current system lanuage and next value by index in Arr
; If current language is not found, it sets system to first language from Arr
SetNextLanguage(Arr) {
  lang := GetKeyboardLayout()
  idx := IndexOf(Arr, lang)
  if (idx < 0) {
    SetKeyboardLayout(Arr[1])
    return
  }
  nextIdx := mod(idx+1, Arr.Length())
  next := Arr[nextIdx+1]
  SetKeyboardLayout(next)
}

; Alt+Shift hotkey - cycle between AltShiftLangs
LAlt & LShift::
SetNextLanguage(AltShiftLangs)
return

; Ctrl+Alt hotkey - switch directly to isolated CtrlAltLang
LCtrl & LAlt::
SetKeyboardLayout(CtrlAltLang)
return
0
Alexander Tumin