手動で登録操作をするしかないのでしょうか?
プログラミングすることは可能です。
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
有難うございます。imm〜で出来るのですね。何かのAPIで出来るのだろうと思って、本○で店員に嫌われながら直「立読み」で探していたのですが分かりませんでした。ご教示の通りやってみます、まずはお礼まで。
サンプルプログラムについてのご質問。
Call GetStyle(colStyle)のcolStyleの定義がないので頭にDim〜で定義すると、1度目はうまくいきますが、2度目はcolStyle.Add で「このキーは既にこのコレクションの要素に割り当てられています」でエラーになりますね。これを回避するのはどうすればいいのでしょうか?(>_<)
colStyleは、Form_LoadのところでCollectionオブジェクトとして定義しています。それを引数にしています。
あと、GetStyle関数はスタイル(品詞)を取得するための関数ですので起動時1回のみ実行するようにしてください。
ファイルからの登録するTangoTourokuFromFile関数だけを、ファイルを読み込む分だけ実行するという流れをとってください。
ツイート | ![]() |