ロケーションバーで、IMEをオフにする
基本、曇りで、太陽は出なかったけれど、風がほとんどなかったので、昨日同様、あったかだった。
お昼頃、午後にパラパラと通り雨。
夜になってから、少しの間だけ、しっかり雨。
Firefoxでは、userChrome.cssを使って出来るからいいのだけれど、Edge(Chrome)で、ロケーションバー(URLバー、アドレスバー)上に、ショートカットキー(Ctrl+l)で移動した時、自動でIMEをオフにしたい。
なんでかと言うと、検索する時に、色んな検索サイトでショートキーを設定しているから。
例えば、Yahoo! JAPANであれば、y→スペース→検索文字、YouTubeであれば、yt→スペース→検索文字、Google Mapであれば、gm→スペース→検索文字、という具合に、その検索ページに飛ぶようにしている。
ロケーションバーに遷移した時、IMEがオンだと、いちいちオフにしないといけないし、IMEがオンのまま、yと打って、F9→F8で半角に変換すると、補完機能が働いて、そのままy→スペースが打てない。
Firefoxの場合は、先述の通り、userChrome.cssの中に、下記を記述しておけば、自動でIMEをオフに出来る。
#urlbar *|input {
ime-mode: inactive !important;
}
EdgeやChromeの場合は、そういうアドオンがあるのだけれど、それを動かすことを前提にした、別のアドオンもインストールしてないといけない。
他に何か方法はないかなぁ、と思って検索すると、自分にとってはとてもいい方法があった!
それは、AutoHotkeyを使う方法。
検索して見つけたものは、v1だったので、それをv2に置き換えて実装出来た。
2種類の関数があり、好きな方を選んで使うといいだろう。
片方はコメント化している。
ということで、AutoHotkey v2を使って、ロケーションバーで、IMEをオフにするやり方。
^t::
^l::
^n::
^+n::
{
Send A_ThisHotkey ;元のショートカットキーを実行する変数
;Sleep(200)
If WinActive("ahk_exe msedge.exe") or WinActive("ahk_exe chrome.exe")
{
If ImeGetState() = 1 ;もしくは、If IME_GET() = 1
{
Send("{Delete}")
Send("^{Space}") ;もしくは、IME_SET(0)
}
}
return
}
; アクティブウィンドウのIME状態を取得
ImeGetState() {
; アクティブウィンドウのハンドルを取得
vCurrentWindow := WinGetID("A")
; IMEの状態を取得
vImeState := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "UInt", vCurrentWindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
; 結果を返す
return vImeState
}
/*
;https://qiita.com/kenichiro_ayaki/items/d55005df2787da725c6f
;-----------------------------------------------------------
; IMEの状態の取得
; WinTitle="A" 対象Window
; 戻り値 1:ON / 0:OFF
;-----------------------------------------------------------
IME_GET(WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("DWORD", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x0005 ;wParam : IMC_GETOPENSTATUS
, "Int", 0) ;lParam : 0
}
;-----------------------------------------------------------
; IMEの状態をセット
; SetSts 1:ON / 0:OFF
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("Uint", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint",stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x006 ;wParam : IMC_SETOPENSTATUS
, "Int", SetSts) ;lParam : 0 or 1
}
*/
説明。
- ロケーションバーに移動するショートカットキー4つに関して、今回の処理を実施する
- 「A_ThisHotkey」は、そのショートカットキー本来の動作をする変数
どういうブラウザであっても、もっと言えば、他のソフトウェアで、同じショートカットキーがあっても、本来の動作をする - 次に、EdgeかChromeだったら、その中の処理をする
もし、Firefoxや他のブラウザも追加したいなら、orで接続 - IMEの状態をチェックし、オンだったら、その中を実行
- ロケーションバーに遷移したら、中の文字を「Delete」
この処理がいらないなら、この行を削除してもよい - 次に、IMEを切り替えるキーを送信
この場合は、Ctrl+Spaceキー。自分は、これで切り替えている
もし、「半角/全角」キーやAlt+‘で切り替えているなら、それを送信してあげればいい
これで、ロケーションバーに遷移した時、IMEが自動でオフになる。
IMEの状態判断やIMEの切り替えに関して、上記は2種類用意した。
コメントにしているのは、
Autohotkey v2.0のIME制御用 関数群 IMEv2.ahk #AutoHotkey - Qiita
のサイトで公開されていた関数。
IMEの切り替えキーを送信するのが面倒なら、これを使うといい。
また、IME関連のものを多用するなら、そのページに書かれている関数を1つのファイルにして読み込んでもいいだろう。
と、こんな感じで、出来たらいいなぁ、ということが、常用しているAutoHotkeyで実現したので、これでちょっとしたストレスが解消。
アドオンを使うと、メモリ消費量も増えるしね。
が、今まで、ロケーションバーで文字入力後、IMEをオフにする癖をつけていたので、それを取り除かないといけないのである。(苦笑)
習慣って面白いね。
まだ何も思いつかないけれど、AutoHotkeyを使えば、キーを使ってのブラウザ操作でプラスαの動作をさせて、より便利に使えるようになるね。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- とうとう来てしまった(2024.12.04)
- 定例のアップデート(2024.11.28)
- 今日はどうだったか(2024.11.22)
- 何かが降ってきた(2024.11.21)
- 画面内の文字をテキスト化(2024.11.19)
コメント