(AutoHotkey)(質問に対するレス)
スカイさんから 以下のような質問があったので 考えてみました
以前も 書いたとおり 個人的には
アクティブなウインドウの判断は ホットキーの呼び出しルーチンの中で 判断するパターンしかやってないので
そのように 書き換えさせてもらいます
それと OSのバージョンや IMEのバージョンによっては うまくいかない時も あるみたいですので
これで 上手く行かない場合もあることも あらかじめご了承ください
今回の問題は 単に 半角/全角キーを Sendしているだけだから
IME の ON OFF が 想定しているのと 逆の時に おかしくなるって事ですね?
まぁこれも お察しのとおり IME_ON関数で 強制的に切り替えてあげれば うまく イケそうですね
基本的な 処理内容も 以前書いていたものと ほぼ同じですね
といった感じになりますでしょうか
もしも 違った場合などは また 追って 書き込みをお願いしますです
もらかなさん はじめまして 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 }
といった感じになりますでしょうか
もしも 違った場合などは また 追って 書き込みをお願いしますです