もらかなです。 このページをアンテナに追加 RSSフィード

2008年02月13日

(AutoHotkey)(IMEの制御をする 編)

 やはり IMEの制御は時として重要です
AutoHotkeyから キー入力を Sendしてみたら IMEがオンになっていて 思うように動かなかったというケースは少なくないでしょう
要は IMEを制御できればいいんですよね、 その処理を 関数化してしまいましょう



 まずは あるウインドウの IMEが ONか OFFか を調べる 関数ですね
IME_IsON(hWindow)
{
	; WM_IME_CONTROL    = 0x0283
	; IMC_GETOPENSTATUS = 0x0005
	bufCurrentDetectMode := A_DetectHiddenWindows
	DetectHiddenWindows, On
	buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
	DetectHiddenWindows, %bufCurrentDetectMode%
	Return buf
}
 これは 処理前のIMEの状態 を 一時的に保存しておいて 処理後に IMEの状態を 元に戻すとかに使えますね
hWindow には 調べたいウインドウのハンドルを入れてください
もしも 「現在アクティブなウインドウ の IMEがONかOFFか」を調べるなら IME_IsON(WinExist("A")) という事になりますね
戻り値は 「ONの時 1」「OFFの時 0」 なので BOOL型として使えます

 DefaultIMEWnd を 取得する時には DetectHiddenWindows を Onにしてないとダメのようですね
処理前の DetectHiddenWindowsの状態を一旦保存して 処理後は 元に戻しましょう、 この後に書くサンプルも この事は同じです

 処理の流れとしては まず 対象のウインドウの DefaultIMEWnd を取得して その ハンドルに対して メッセージを送ります
メッセージコード は WM_IME_CONTROL、 wPalam は IMC_GETOPENSTATUS、 lPalam は 必要ないので NULL値 になります
戻り値は 上にも書いてますが IMEの状態が BOOL型で 返ってくる事になりますね



 次に あるウインドウの IMEを ON OFFする 関数です
実は この後の サンプルも 基本的な形は IME_IsON と ほぼ同じです、 コピペして ちょっといじる程度の 違いしかありません
IME_ON(hWindow, IsON)
{
	; WM_IME_CONTROL    = 0x0283
	; IMC_SETOPENSTATUS = 0x0006
	bufCurrentDetectMode := A_DetectHiddenWindows
	DetectHiddenWindows, On
	buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0006, "Int", IsON)
	DetectHiddenWindows, %bufCurrentDetectMode%
	Return buf
}
 メッセージコード は WM_IME_CONTROL、 wPalam は IMC_SETOPENSTATUS、 lPalam は 「ONにするなら 1」「OFFにするなら 0」つまり BOOL型 で指定します
現在アクティブな ウインドウの IME を ONにする場合は IME_ON(WinExist("A"), True)、 OFFにする場合は IME_ON(WinExist("A"), False) で OKです
戻り値は 「成功時 0」「失敗時 0以外」です、 失敗時に Trueになるパターンですね 注意してください



 さらに 欲しい情報としては 「かな入力」か「ローマ字入力」か とか 「全角」か「半角」か とか 「かな文字」か「英数字」などの情報ですね
これも これまでのパターンと 同じ方法で 取得・設定 が 可能です
まずは 状態の 取得からですね
IME_GetConversion(hWindow)
{
	; WM_IME_CONTROL        = 0x0283
	; IMC_GETCONVERSIONMODE = 0x0001
	bufCurrentDetectMode := A_DetectHiddenWindows
	DetectHiddenWindows, On
	buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0001, "Int", 0)
	DetectHiddenWindows, %bufCurrentDetectMode%
	Return buf
}
 メッセージコード は WM_IME_CONTROL、 wPalam は IMC_GETCONVERSIONMODE、 lPalam は 必要ないので NULL値です
戻り値は 現在の状態が帰ってきます、 状態に関しては 下の 状態一覧表 を 参照してください
状態一覧表
	 0 = かな入力 半角英数
	 3 = かな入力 半角カナ
	 8 = かな入力 全角英数
	 9 = かな入力 全角ひらがな
	11 = かな入力 全角カタカナ
	16 = ローマ字入力 半角英数
	19 = ローマ字入力 半角カタカナ
	24 = ローマ字入力 全角英数
	25 = ローマ字入力 全角ひらがな
	27 = ローマ字入力 全角カタカナ



 取得の次は 設定になりますね、 もう このパターンにも 慣れましたよね
IME_SetConversion(hWindow,ConversionMode)
{
	; WM_IME_CONTROL        = 0x0283
	; IMC_SETCONVERSIONMODE = 0x0002
	bufCurrentDetectMode := A_DetectHiddenWindows
	DetectHiddenWindows, On
	buf := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint",hWindow), "UInt", 0x0283, "Int", 0x0002, "Int", ConversionMode)
	DetectHiddenWindows, %bufCurrentDetectMode%
	Return buf
}
 メッセージコード は WM_IME_CONTROL、 wPalam は IMC_SETCONVERSIONMODE、 lPalam は 設定したい状態です 値は 上の 状態一覧表 を参照してください
戻り値は 「成功時 0」「失敗時 0以外」です、 こちらも 失敗時に Trueになるパターンです

オヤジオヤジ 2008/04/18 05:15 AutoHotkeyを使い始めたばかりの者です。
XPのエクスプローラでフォルダを作成するショートカットキーを作りました。

#IfWinActive ahk_class CabinetWClass
^k::Send,!fwf
#IfWinActive

ですが、IMEがONの時には誤動作してしまいます。
そこでインターネットで調べていたら、ここにたどり着いたのですが、
公開された関数を使って、IMEのON/OFFにかかわらず上記の機能を実現するには
どのようにすればいいのが教えていただければありがたいです。

もらかなもらかな 2008/04/18 06:19  
 はじめましてです オヤジさん
とりあえず考えてみたものを新しい記事として書きましたので
そちらの方を参照のこと よろしくお願いします

ketttkettt 2008/05/02 23:55 たいへん参考になりました。
ありがとうございます。

もらかなもらかな 2008/05/03 03:18  ketttさん、はじめましてです
少しでも参考になれたのであれば嬉しいです 笑)

ketttkettt 2008/05/03 09:33 度々失礼します。質問があります。
IMEがONのときだけ、「;」キーを「ん(nn)」に置き換えるスクリプトを書きました。

#UseHook

`;::
If IME_IsON(WinExist(”A”)) == 1{
Send, nn
}else{
Send, `;
}
return

#UseHook Off

IME_IsON(hWindow){
; WM_IME_CONTROL = 0x0283
; IMC_GETOPENSTATUS = 0x0005
bufCurrentDetectMode := A_DetectHiddenWindows
DetectHiddenWindows, On
buf := DllCall(”user32.dll¥SendMessageA”, ”UInt”, DllCall(”imm32.dll¥ImmGetDefaultIMEWnd”, ”Uint”,hWindow), ”UInt”, 0x0283, ”Int”, 0x0005, ”Int”, 0)
DetectHiddenWindows, %bufCurrentDetectMode%
Return buf
}

しかし、Internet Explorer7内のフォームのテキストボックスにおいては、正しいIMEのON/OFF状態が取得できません。
ClassNNというのを利用すればよいのではないかとにらんでいるのですが……
このような場合に、正しくIMEの状態を取得する方法をご存じでしたらご教授いただけませんでしょうか。

もらかなもらかな 2008/05/03 18:35  レスは新しい記事として書きましたので
そちらの方を参照お願いします
まぁ 完全な解決には至ってないと思いますので
何かありましたら 追って書き込みよろしくお願いします

ごんじごんじ 2010/07/22 17:38 はじめまして。
PHPの開発環境eclipseの制御にこの記事を参考にさせていただきました。
おかげさまで格段に使いやすくなりました。ありがとうございました。

もらかなもらかな 2010/07/26 20:36 >ごんじさん
 はじめまして、
書き込みに気づくのが遅れてレスが遅くなってしまいました、すみません
少しでもお役に立てたのであれば幸いです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証