2010年10月05日

進まない

今更技術調査みたいなことやり直してるせいで、
本来すべき作業が全然進んでません。

まぁ、昨日の打ち合わせが想像していた以上に長かったってのもあるんですが。

今やってる作業は結構楽だろうと思ってたんですが、
全然進まないせいでスケジュールを圧迫し始めました。

製品来る前に評価版使ってVS2010の調査もしないといけないのにorz

……明日は定時退社なので、明後日から頑張りますw


そうそう、昨日23時半からだったのでAT-Xでヨスガノソラ見ました。

……あれは確かに視聴年齢制限掛かるわw
最後のあのコーナーは何? 要るの?

別の意味でやりたい放題な気がしますが、
なんとかこのまま頑張ってもらいたいです。
posted by 鏡月朱鷺 at 21:36| Comment(0) | TrackBack(0) | 日記

IMEバッファのクリア

簡単な話書いただけで、実際のソース書いてなかったので記載します。

手書き入力パネルによる入力のとき、
エンターキーを一度押しただけではバッファに出力されるだけで確定されず、
押し忘れて画面を閉じると、入力した内容が反映されない。

更に再度画面を開くと、キャレットが表示されず、
手書きパネルでエンターを押すと、前に入力していた内容が確定して
テキストボックスに出力されるという現象がありました。

で、IMEのバッファをクリア(同時に入力内容を取得)する方法です。
バッファの内容をテキストボックスに出力際は、返り値を出力してください。


/// <summary>
// IME入力中文字取得に使用する値(ひらがな)
/// </summary>
private const int GCS_COMPSTR = 0x0008;

/// <summary>
/// 指定されたウィンドウに関連付けられている入力コンテキストを取得します。
/// </summary>
[DllImport("CoreDll.Dll")]
private static extern int ImmGetContext(IntPtr hWnd);

/// <summary>
/// 変換文字列に関する情報を取得します。
/// </summary>
[DllImport("CoreDll.Dll")]
private static extern int ImmGetCompositionString(int hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen);

/// <summary>
/// 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除します。
/// </summary>
[DllImport("CoreDll.Dll")]
private static extern bool ImmReleaseContext(IntPtr hWnd, int hIMC);

/// <summary>
/// IME を開いたり閉じたりします。
/// </summary>
[DllImport("CoreDll.Dll")]
private static extern bool ImmSetOpenStatus(int hIMC, bool fOpen);

/// <summary>
/// IMEバッファをクリアします
/// </summary>
/// <param name="hwnd">バッファをクリアしたいウィンドウのハンドル</param>
/// <param name="blRetrun">バッファ内文字列の取得有無</param>
/// <returns>IMEバッファの変換中文字列</returns>
public static string IMEClear(IntPtr hwnd, bool blRetrun)
{
    string strReturn = "";
    try
    {
        //入力コンテキストを取得
        int hIMC = ImmGetContext(hwnd);

        //戻り値が必要な場合、バッファの処理を行う
        if (blRetrun == true)
        {
            //現在の入力中のデータを取得
            int strLen = ImmGetCompositionString(hIMC, GCS_COMPSTR, null, 0);
            StringBuilder str = new StringBuilder(strLen);
            ImmGetCompositionString(hIMC, GCS_COMPSTR, str, str.Capacity);

            //戻り値用の変数にセット
            strReturn = str.ToString();
        }

        //現在のIMEの状態をクリアするため、一旦IMEを閉じて開く
        ImmSetOpenStatus(hIMC, false);
        ImmSetOpenStatus(hIMC, true);
        //入力コンテキストを解放
        ImmReleaseContext(hwnd, hIMC);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return strReturn;
}



参考文献

blog.C#| IME入力中の文字列取得C#
ttp://shinshu.fm/MHz/95.83/a02138/0000025041.html
第281章
ttp://homepage2.nifty.com/c_lang/sdk3/sdk_281.htm
lnput Method Editor (IME)
ttp://msdn.microsoft.com/ja-jp/library/cc422019.aspx

ちなみに、ImportするDLLをCoreDllからimm32に変更すれば
通常のWindowsで使用できると思います。
※試してはいません。
posted by 鏡月朱鷺 at 21:33| Comment(0) | TrackBack(0) | WindowsCE・PDA