1 件の投稿を表示中 (合計 8 個)
  • 作成者
    投稿
  • #5892
    匿名
    ゲスト

    ATOK設定で「カーソル位置前後の文章を参照して変換する 」をオンにすると、一太郎やワードでは入力文字の前後の文脈を解析して、文脈に合うように変換しますが、EmEditorもこの機能を使えるようにしてほしいです。

    (前後参照変換の例)
    花が
    布を
    時間を
    上記の行末で「さいた」と入力して変換を行うと、それぞれ「咲いた」「裂いた」「割いた」が第一候補となります。

    #7475
    Aye Wong
    メンバー

    前後参照変換への対応については、以下のURLで実装方法が紹介されていますね。
    http://d.hatena.ne.jp/topiyama/20070703/p1

    #7478
    Yutaka Emura
    キーマスター

    Aye Wongさんは書きました:
    前後参照変換への対応については、以下のURLで実装方法が紹介されていますね。
    http://d.hatena.ne.jp/topiyama/20070703/p1

    これも参考にしてやってみましたが、なかなかうまくいかないですね。何が足りないのでしょうか?

    #7480

    横から失礼

    このスレ見てプラグインを作ろうとしてたのですが、本体側で対応してくれるのならプラグインいらないですね。

    こっちでは機能するようになったので、ソースの一部を張っときます。

    case WM_IME_REQUEST:
    if( wParam == IMR_DOCUMENTFEED ){
    POINT_PTR pos;
    Editor_GetCaretPos( hwnd, POS_LOGICAL_W, &pos );
    GET_LINE_INFO inf;
    inf.cch = 0;
    inf.flags = FLAG_LOGICAL;
    inf.yLine = pos.y;
    UINT_PTR size( Editor_GetLineW( hwnd, &inf, NULL ) );
    inf.cch = size + 32;
    wchar_t* buf( (wchar_t*)_alloca( inf.cch * sizeof(wchar_t) ) );
    if( buf ){
    Editor_GetLineW( hwnd, &inf, buf );
    size_t len( wcslen(buf) );
    /* wchar_t str[30];
    swprintf_s( str, L” %d”, lParam );
    wcscat_s( buf, inf.cch, str );
    MessageBox( hwnd, buf, L””, MB_OK );/**/
    if( lParam ){
    RECONVERTSTRING* rcs( (RECONVERTSTRING*)lParam );
    memset( rcs, 0, sizeof(RECONVERTSTRING) );
    rcs->dwSize = sizeof(RECONVERTSTRING);
    rcs->dwStrOffset = sizeof(RECONVERTSTRING);
    rcs->dwStrLen = (DWORD)len;
    rcs->dwTargetStrOffset = (DWORD)(min( (size_t)max( pos.x, 0 ), len ) * sizeof(wchar_t));
    wcscpy_s( (wchar_t*)(rcs + 1), len + 1, buf );
    }
    return sizeof(RECONVERTSTRING) + (len + 1) * sizeof(wchar_t);
    }
    }
    break;

    このソースはUnicode版のものです。
    多分に余計なものも含まれてるでしょうが、私のところではこれで、32bit,64bitともに動いてます。

    参考になりますでしょうか・・・

    #7482
    Yutaka Emura
    キーマスター

    OTStardustさんは書きました:
    横から失礼

    このスレ見てプラグインを作ろうとしてたのですが、本体側で対応してくれるのならプラグインいらないですね。

    こっちでは機能するようになったので、ソースの一部を張っときます。

    case WM_IME_REQUEST:
    if( wParam == IMR_DOCUMENTFEED ){
    POINT_PTR pos;
    Editor_GetCaretPos( hwnd, POS_LOGICAL_W, &pos );
    GET_LINE_INFO inf;
    inf.cch = 0;
    inf.flags = FLAG_LOGICAL;
    inf.yLine = pos.y;
    UINT_PTR size( Editor_GetLineW( hwnd, &inf, NULL ) );
    inf.cch = size + 32;
    wchar_t* buf( (wchar_t*)_alloca( inf.cch * sizeof(wchar_t) ) );
    if( buf ){
    Editor_GetLineW( hwnd, &inf, buf );
    size_t len( wcslen(buf) );
    /* wchar_t str[30];
    swprintf_s( str, L” %d”, lParam );
    wcscat_s( buf, inf.cch, str );
    MessageBox( hwnd, buf, L””, MB_OK );/**/
    if( lParam ){
    RECONVERTSTRING* rcs( (RECONVERTSTRING*)lParam );
    memset( rcs, 0, sizeof(RECONVERTSTRING) );
    rcs->dwSize = sizeof(RECONVERTSTRING);
    rcs->dwStrOffset = sizeof(RECONVERTSTRING);
    rcs->dwStrLen = (DWORD)len;
    rcs->dwTargetStrOffset = (DWORD)(min( (size_t)max( pos.x, 0 ), len ) * sizeof(wchar_t));
    wcscpy_s( (wchar_t*)(rcs + 1), len + 1, buf );
    }
    return sizeof(RECONVERTSTRING) + (len + 1) * sizeof(wchar_t);
    }
    }
    break;

    このソースはUnicode版のものです。
    多分に余計なものも含まれてるでしょうが、私のところではこれで、32bit,64bitともに動いてます。

    参考になりますでしょうか・・・

    ありがとうございます。まったく同じようにやっているはずなのですが、私の手元の MS-IME (Windows Vista 64bit に付属) ではうまくいかなかったです。これから他の環境でもテストしてみます。ちなみに、どういう環境でうまくいきましたか? OS、ATOK (MS-IME) のバージョンを教えていただけますか?

    #7483

    こちらのコードが動いたのは、
    32bit版
    WinXP+ATOK2008
    WinXP+MS-IME2002(詳細なテキストサービスのサポートをプログラムのすべてに拡張する offの時のみ)
    64bit版
    WinVista+ATOK2008
    EmEditor 8.05です

    WinVista64bit+MS-IMEは、こっちもダメですね・・・

    #7484
    Yutaka Emura
    キーマスター

    OTStardustさんは書きました:
    こちらのコードが動いたのは、
    32bit版
    WinXP+ATOK2008
    WinXP+MS-IME2002(詳細なテキストサービスのサポートをプログラムのすべてに拡張する offの時のみ)
    64bit版
    WinVista+ATOK2008
    EmEditor 8.05です

    WinVista64bit+MS-IMEは、こっちもダメですね・・・

    こちらでも、Windows XP + 付属の MS-IME では正しく動作しました。Windows Vista ではだめですね。「詳細なテキストサービスのサポートをプログラムのすべてに拡張する 」というのがポイントのようですね。Windows Vista ではこれが常にオンになるようです。Text Services Framework に対応しないといけないのかもしれないですね。この件は、時間があるときにさらに調べてみたいと思います。どうも調べていただいて、ありがとうございました。

    #7537
    Yutaka Emura
    キーマスター

    Yutakaさんは書きました:

    OTStardustさんは書きました:
    こちらのコードが動いたのは、
    32bit版
    WinXP+ATOK2008
    WinXP+MS-IME2002(詳細なテキストサービスのサポートをプログラムのすべてに拡張する offの時のみ)
    64bit版
    WinVista+ATOK2008
    EmEditor 8.05です

    WinVista64bit+MS-IMEは、こっちもダメですね・・・

    こちらでも、Windows XP + 付属の MS-IME では正しく動作しました。Windows Vista ではだめですね。「詳細なテキストサービスのサポートをプログラムのすべてに拡張する 」というのがポイントのようですね。Windows Vista ではこれが常にオンになるようです。Text Services Framework に対応しないといけないのかもしれないですね。この件は、時間があるときにさらに調べてみたいと思います。どうも調べていただいて、ありがとうございました。

    やっと Vista でも、MS-IME の前後参照変換に対応できました。Text Services Framework に対応する必要もありませんでした。v9 alpha 20 が公開されたら、お試しください。

1 件の投稿を表示中 (合計 8 個)
  • このトピックに返信するにはログインしてください。