(AutoHotkey)(質問に対するレス)

 ketttさんの質問で
度々失礼します。質問があります。
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の状態を取得する方法をご存じでしたらご教授いただけませんでしょうか。
というのがありましたので 考えてみました

 私の場合 ブラウザは IE6で使っているので 以下のを書いても 上手く行く保証はありませんのであしからずです

 IE6で確認した所 IMEの状態は キーボードカーソル の 位置によって変わるようで
入力フォームにキーボードカーソルがあれば(テキストボックス内等でキーボードカーソルが点滅している状態ですね)
ON/OFFの状態はきちんと取得できていますが
それ以外の(文字入力が出来ない) 所に キャプションがある場合は 0が必ず返ってきていますね
まぁ それはそれで 特に問題は無いと思うので とりあえず スクリプトを書いてみました
$vkBBsc027::
{
	IfWinActive, ahk_class IEFrame
	{
		If IME_IsON(WinExist("A"))
		{
			Send, nn
			Return
		}
	}
	Send, {vkBBsc027}
	Return
}

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
}
InternetExplorerに特化しなくてもいいのなら IEFrameで比較する部分は 必要ないですね
$vkBBsc027::
{
	If IME_IsON(WinExist("A"))
		Send, nn
	Else
		Send, {vkBBsc027}
	Return
}

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
}
となると 基本的には ketttさんが 書かれているものと ほぼ同じになるんですけどね 笑)

 まぁ 一応 これで 私の環境では うまく行ってはいます
もしかすると IEのバージョンで挙動が変わってしまったりするんでしょうかね
そこら辺までは 私のレベルでは ちょっと分かりかねますです 笑)