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

 スカイさんから 以下のような質問があったので 考えてみました
もらかなさん はじめまして
AHKをはじめたばかりのスカイと申します.
ユーザー関数のIME_IsON(hWindow)とIME_ON(hWindow, IsON)
も「Ctrl+kの時に呼び出されるルーチン」のようにコメント
つきでご説明していただけませんでしょうか?

私ではお恥ずかしい話なのですが,詳しく解説して
いただかないと理解ができないのです.
お願いいたします.

今,EXCELで「ggge”年”m”月”d”日”」のセル書式を
左Ctrl と 右Shift と D を押したときに
「yyyy/mm/dd」に変更するようにしたいのです
現在,
#IfWinActive ahk_class XLMAIN
>+<^D::
Send, {vkF3sc029}
Send,^1!c{End}!tyyyy/mm/dd{Enter}
Send, {vkF3sc029}
このようなコードで使っていますが,これだと
最初からIMEがOFFの場合に動作がおかしくなって
しまうため
もらかなさんのコードを理解させていただきまして
変更したいのです

ご多忙のところ申し訳ございませんが
どうぞ,よろしくお願いいたします

 以前も 書いたとおり 個人的には
アクティブなウインドウの判断は ホットキーの呼び出しルーチンの中で 判断するパターンしかやってないので
そのように 書き換えさせてもらいます
それと OSのバージョンや IMEのバージョンによっては うまくいかない時も あるみたいですので
これで 上手く行かない場合もあることも あらかじめご了承ください

 今回の問題は 単に 半角/全角キーを Sendしているだけだから
IME の ON OFF が 想定しているのと 逆の時に おかしくなるって事ですね?
まぁこれも お察しのとおり IME_ON関数で 強制的に切り替えてあげれば うまく イケそうですね
基本的な 処理内容も 以前書いていたものと ほぼ同じですね

>+<^D::
{
	; アクティブなウインドウのハンドルを取得します
	; このハンドルで IME を ON OFF するウインドウを指定する事になります
	hWindow := WinExist("A")

	; 上で取得したハンドルから クラス名を取得します
	; その クラス名 と 比較する事によって アプリケーションを特定できる事になります
	WinGetClass, ClassName, ahk_id %hWindow%

	; アクティブなウインドウ の クラス名 が「XLMAIN」だったら 以下のブロックを実行
	If RegExMatch(ClassName, "XLMAIN")
	{
		; IME_IsONユーザ関数 を 使って 現在の IMEのモードを保存する
		; IME_IsON(<ウインドウハンドル>) で そのウインドウの IME の ON OFF状態 を 取得します
		; その値を LastImeModeと言う変数に 一旦 保存しておきます
		LastImeMode := IME_IsON(hWindow)

		; IME_ONユーザ関数 を 使って IMEのモードを強制的に OFFにする
		; 今回は 半角英数字を入力するのが目的なので 第二引数は False(偽) と言う事になります
		IME_ON(hWindow, False)

		; 日付フォームの再設定部分をSendする
		; この部分は 質問の内容を そのまま コピペさせてもらいました
		Send,^1!c{End}!tyyyy/mm/dd{Enter}

		; 一旦保存しておいた IMEの ON OFF状態に戻す
		; まぁ ここは いちいち現在のモードとかを 判断せずに 強制的に書き戻した方が早いでしょう
		IME_ON(hWindow, LastImeMode)
	}
	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
}
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
}

 といった感じになりますでしょうか
もしも 違った場合などは また 追って 書き込みをお願いしますです