IME辞書に「テキストファイルからの登録」をプログラムでする方法は?


直立エン人  2004-01-16 18:14:06  No: 81495

手動で登録操作をするしかないのでしょうか?


k.k  2004-01-20 00:36:12  No: 81496

プログラミングすることは可能です。
IMEのAPI関数はOSによって動作するものと動作しないものとがあるので
とくに98系は動作しないものがあります。Win2000ならほぼ問題なく動作
すると思います。
サンプルプログラムが、はたして直立エン人さんの環境で動くかどうかは
わかりません。
一応、私の環境は
Win2000sp2 VB6
です。一応この環境でサンプルプログラムを作成して動作確認は取れました。
サンプルプログラムをフォームにはっつけて実行してみてください。

'サンプルプログラム

Option Explicit

Private Const STYLE_DESCRIPTION_SIZE = 32
Private Type STYLEBUF
        dwStyle As Long
        'APIビューワでは、szDescriptionはString型となってるけど
        '私の環境でString型としちゃうとアプリが飛んでしまう。
        'なのでByte型配列にしてます。
        szDescription(31) As Byte
End Type
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
Private Declare Function ImmGetRegisterWordStyle Lib "imm32.dll" Alias "ImmGetRegisterWordStyleA" (ByVal hKL As Long, ByVal nItem As Long, lpStyleBuf As STYLEBUF) As Long
Private Declare Function ImmRegisterWord Lib "imm32.dll" Alias "ImmRegisterWordA" (ByVal hKL As Long, ByVal lpszReading As String, ByVal dwStyle As Long, ByVal lpszRegister As String) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private hKL         As Long
Private rc          As Long

Private Sub Form_Load()
    '設定可能なスタイル(品詞)を取得
    Call GetStyle(colStyle)
    'ファイルから単語登録
    TangoTourokuFromFile
End Sub

'----------------------------------------
'ファイルから単語登録する関数
'----------------------------------------
Private Sub TangoTourokuFromFile()
    Dim colStyle    As New Collection
    Dim strYomi     As String
    Dim strKanji    As String
    Dim strStyle    As String
    Dim strLineData As String
    Dim varData     As Variant
    
    '登録するファイルを開く
    'IMEのフォーマットに従い
    '1行のデータは
    '読み[タブ]漢字[タブ]スタイル(品詞)
    'としています。
    'あと、IMEが出力する単語リストのテキストファイルの最初には、
    'ツール名やバージョンやらがありますが、このプログラムでは
    '1行目から登録データがあることとしています。
    'もし、IMEが出力するテキストファイルも扱いたい場合は、調整してください。
    Open "C:\output1.txt" For Input As #1
    While Not EOF(1)
        Line Input #1, strLineData
        varData = Split(strLineData, vbTab)
        'わざわざそれぞれ変数に入れなおさなくても,varDataを直接使ってもいいでつ
        strYomi = varData(0)
        strKanji = varData(1)
        strStyle = varData(2)
        rc = ImmRegisterWord(hKL, strYomi, colStyle(strStyle), varData(1))
    Wend
End Sub

'----------------------------------------
'設定可能なスタイルを取得する関数
'----------------------------------------
Private Sub GetStyle(colStyle As Collection)
    Dim stlBuff()   As STYLEBUF
    Dim num         As Long
    Dim cnt         As Long
    
    'とりあえず0で定義する
    ReDim stlBuff(0)
    'キーボードレイアウトを取得
    hKL = GetKeyboardLayout(0)
    '第2引数のスタイル数を設定するところに0を設定して実行すると
    '戻り値にスタイル数が返ってくるのね
    num = ImmGetRegisterWordStyle(hKL, 0, stlBuff(0))
    'んで、取得したスタイル数を元にSTYLEBUFF構造体配列を再定義
    ReDim stlBuff(num - 1)
    '改めて、スタイル数を設定して実行し、STYLEBUFF構造体配列に情報を取得します。
    '取得されるのはスタイル値と、スタイル名称の2つ
    rc = ImmGetRegisterWordStyle(hKL, num, stlBuff(0))
    'スタイル名称からスタイル値が求められるように、コレクションオブジェクトに登録します。
    For cnt = 0 To num - 1
        colStyle.Add stlBuff(cnt).dwStyle, StrConv(stlBuff(cnt).szDescription, vbUnicode)
    Next
End Sub


直立エン人  2004-01-20 23:23:14  No: 81497

有難うございます。imm〜で出来るのですね。何かのAPIで出来るのだろうと思って、本○で店員に嫌われながら直「立読み」で探していたのですが分かりませんでした。ご教示の通りやってみます、まずはお礼まで。


直立エン人  2004-01-24 03:54:33  No: 81498

サンプルプログラムについてのご質問。
Call GetStyle(colStyle)のcolStyleの定義がないので頭にDim〜で定義すると、1度目はうまくいきますが、2度目はcolStyle.Add で「このキーは既にこのコレクションの要素に割り当てられています」でエラーになりますね。これを回避するのはどうすればいいのでしょうか?(>_<)


k.k  2004-01-24 06:43:03  No: 81499

colStyleは、Form_LoadのところでCollectionオブジェクトとして定義しています。それを引数にしています。
あと、GetStyle関数はスタイル(品詞)を取得するための関数ですので起動時1回のみ実行するようにしてください。
ファイルからの登録するTangoTourokuFromFile関数だけを、ファイルを読み込む分だけ実行するという流れをとってください。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加