=============================================================================
【 名  称 】 Autohotkey IME制御用 関数群 (コピペ/組込用)(IME.ahk)
【動作環境】 日本語入力システムが使える Windows系OS
【製作言語】 AutoHotkey Scripts (http://www.autohotkey.com/)
【 更新日 】 2012.11.10
【 製作者 】 eamat.
【  URL   】 http://www6.atwiki.jp/eamat/
=============================================================================
.■動作環境
    AutoHotkey : v1.0.46以降くらい
    OS         : NT系 (98系は確認環境がもうないので不明) 

    動作確認   : Windows XP x86 SP3
                 Windows 7  x64 SP1
          IME  : WXG Ver 4.03.027
                 MS-IME 2002 ver.8.1     (XP付属物)
                 Office IME 2007 ver12.0 (Microsoft Office OneNote 2007付属物)
                 ATOK Ver 16             (一太郎13 付属物)
                 SKKIME for WindowsXP Ver.1.5 (2009/06/28)
.■概要
   IMEの各種状態の取得、セット関数群

.■注意事項
  ・入力モードについて
    IMM32のAPIで見てるので、TSF系のIMEだと値がうまく取れないようです。
    (ちなみに GoogleIMEはTSFからIMM32に変更されており、2012現在は値取れてます。
     http://googlejapan.blogspot.jp/2010/09/google-01348110x.html )

    ※ ローマ字/かな入力モードの状態取得について(IME_GetConvMode())
    [Ctrl]+[CapsLock]および 言語バー[KANA]ボタンで切替えた時の状態は取れない
    みたいです。[Alt]+[カタカナ]キーで切替えた場合の状態は取れました。
    (XP Pro SP2/ AHK 1.0.47.06にて確認)

  ・変換モードについて
    IMEの種類によって値はバラバラみたいです。
    とりあえずこちらで調査したところではこんな感じ。

    MS-IME 0:無変換 / 1:人名/地名                    / 8:一般    /16:話し言葉
    ATOK系 0:固定   / 1:複合語              / 4:自動 / 8:連文節
    WXG             / 1:複合語  / 2:無変換  / 4:自動 / 8:連文節
    SKK系           / 1:ノーマル (他のモードは存在しない？)

  ・文字入力/変換中状態の取得について IME_GetConverting()
    2ちゃんに貼られた IME_IsConverting() を元にしています。
    (http://sites.google.com/site/agkh6mze/scripts#TOC-IME-)
    Class名で判断しているため未知のIMEだと検知できません。
    単にClass名を足してけばいいだけっぽいので、未対応のIME使用の方は
    仕込んであるテストルーチンで適当に調べて追加してください。
    もしくはClass名をお教えいただければこちらで追加いたします。

.■使用方法
  ANSI\  :ANSI版   (本家/A32)
  UTF8\  :UTF-8版  (U32/U64)  ※ファイル形式違うだけ。中身はどちらも一緒です。

..◆組込元で #Include IME.ahkして各関数を呼び出して使用

..◆関数ライブラリスクリプトとして使用
     AutoHotkey.exeのあるフォルダ内の「Lib」フォルダ、もしくは
    「%A_MyDocuments%\AutoHotkey\Lib\」に突っ込んどくと#Includeなしで使えます。

   ・必要関数だけをスクリプトにコピペして使用
     IME OFFるのにしか使わない方など、IME_SET()だけ切出してご自分のスクリプトに
     適当に貼付けて使って下さい。
     (内部CALLやめたので各関数間に依存関係はありません。)

.■削除方法
    全てのファイルを削除して下さい。
    本スクリプトではレジストリへの読み書きはしていません。

.■改変・再配布
    改変・再配布ともにご自由にどうぞ

    一次配布場所
    http://www6.atwiki.jp/eamat/

.■履歴
  2012.11.10
      ・AutoHotkey_L (A32/U32/U64)対応
      ・WinTitleパラメータが実質無意味化していたのを修正
      ・スクリプトのファイル形式をUTF-8(BOM付)に変更

  2009.12.03 
      ・IME 状態チェック GUIThreadInfo 利用版 入れ込み
        IEや秀丸8βでIME状態が取れなかったのを対応した
        参考：http://blechmusik.xrea.jp/resources/keyboard_layout/DvorakJ/inc/IME.ahk

      ・Google日本語入力β 向け調整
        入力モード 及び 変換モードは取れないっぽい
        IME_GET/SET() と IME_GetConverting()は有効

  2009.07.02
    ・AutoHotkey スレッド part8 99にあった IME_IsConverting() をパクって追加
      http://pc12.2ch.net/test/read.cgi/software/1243005818/99-105
     > 99 名前：名無しさん＠お腹いっぱい。[sage] 投稿日：2009/06/02(火)
     >対象窓で、文字入力中or変換中なら1を、変換候補窓が出ているなら2を、
     >それ以外なら 0を返す。
     >ATOK2007とMS-IME8.1で確認。クラス名がバージョンの数値違いだけなら
     >別verでも通用するかも。

    ・パラメータのWinTitleの既定値を アクティブウィンドウにしたはいいが、
      何故だか妙に回りくどいことをやっていて、Last Found Window
      (http://lukewarm.s101.xrea.com/Window.html#lastfoundwindow)
      が有効にならない仕様になってたのを修正
      Last Found Windowを指定したいときは IME_GET("")とかやって下さい。
      （間抜けな仕様ですみません。)
    ・DllCallだと隠しウィンドウでも操作可能なようなので
        AHK内蔵のSendMessageコマンド → DllCall("SendMessaege")に。
        DetectHiddenWindowsのOn/Off廃止
        （もしかして環境によって問題が生じるようであればご一報下さい）

  2008.12.10 コメント修正
  2008.07.11 (IME.ahk)
    ・v1.0.47以降の 関数ライブラリスクリプト用にファイル名を戻した。
     つか結局丸ごと組込んで使うなら↓の コピペ用の修正いらなかったんじゃ…

  2005.09.12 非公開
    ・依存関係がうっとおしいので関数内で下層関数を呼び出すのを止めた。
    ・v 1.0.34あたりからの Function パラメータ省略機能に対応
      アクティブウィンドウに対する制御は "A" を省略可能に。
    ・WinTitleを省略しやすいようSet系関数のパラメータ順を変更
      IME_SetConvMode(WinTitle,ConvMode)
       → IME_SetConvMode(ConvMode,WinTitle="")
      IME_SetSentenceMode(WinTitle,SentenceMode)
       → IME_SetSentenceMode(SentenceMode,WinTitle="")

    ・IME_ON() IME_OFF() IME_TOGGLE() 廃止
      ON/OFFセットは IME_SET(0or1)で統括

  2005.05.20 SandS同梱版 (IME_Func.ahk)
    ・関数とAPIが使えるようになったので SUB → Function化
      面倒なんである程度カプセル化。リトライとか外してみる。
      アクティブウィンドウに対する制御はIME_STATUS("A")とかやって下さい。
    ・A_DetectHiddenWindowsの状態を覚えておいてIMEへSendMessaegeした後
      戻すようにした。

  2005.03.27 (IME.ahk)
    ・投稿スレ86氏が張られた あぷろだ018.zipのIME制御用外部プログラム
      (Cソース付き)をAHKスクリプトに書き直し。
      (AutoHotkeyを流行らせるアップローダ跡地 http://lukewarm.s101.xrea.com/up/)
