« あったか | トップページ | ピンクの »

2024年2月15日 (木)

ロケーションバーで、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
}
*/

説明。

  1. ロケーションバーに移動するショートカットキー4つに関して、今回の処理を実施する
  2. 「A_ThisHotkey」は、そのショートカットキー本来の動作をする変数
    どういうブラウザであっても、もっと言えば、他のソフトウェアで、同じショートカットキーがあっても、本来の動作をする
  3. 次に、EdgeかChromeだったら、その中の処理をする
    もし、Firefoxや他のブラウザも追加したいなら、orで接続
  4. IMEの状態をチェックし、オンだったら、その中を実行
  5. ロケーションバーに遷移したら、中の文字を「Delete」
    この処理がいらないなら、この行を削除してもよい
  6. 次に、IMEを切り替えるキーを送信
    この場合は、Ctrl+Spaceキー。自分は、これで切り替えている
    もし、「半角/全角」キーやAlt+‘で切り替えているなら、それを送信してあげればいい

これで、ロケーションバーに遷移した時、IMEが自動でオフになる。

IMEの状態判断やIMEの切り替えに関して、上記は2種類用意した。

コメントにしているのは、

Autohotkey v2.0のIME制御用 関数群 IMEv2.ahk #AutoHotkey - Qiita

のサイトで公開されていた関数。

IMEの切り替えキーを送信するのが面倒なら、これを使うといい。

また、IME関連のものを多用するなら、そのページに書かれている関数を1つのファイルにして読み込んでもいいだろう。

と、こんな感じで、出来たらいいなぁ、ということが、常用しているautohotkeyで実現したので、これでちょっとしたストレスが解消。
アドオンを使うと、メモリ消費量も増えるしね。

が、今まで、ロケーションバーで文字入力後、IMEをオフにする癖をつけていたので、それを取り除かないといけないのである。(苦笑)
習慣って面白いね。

まだ何も思いつかないけれど、autohotkeyを使えば、キーを使ってのブラウザ操作でプラスαの動作をさせて、より便利に使えるようになるね。

|

« あったか | トップページ | ピンクの »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« あったか | トップページ | ピンクの »