重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

テキストボックスに文字を入力して、確定と同時にIMEの単語登録辞書を表示せずに、辞書に登録するプログラムを作っているのですが、うまく出来ずにいます。途中のプログラムを載せますので間違いがありましたら教えていただけないでしょうか?

Private Declare Function GetKeyboardLayout_
Lib "user32" (ByVal idThread As Long) As Long_
Private Declare Function ImmRegisterWord_
Lib "Imm32.dll" Alias "ImmRegisterWordA" _
(ByVal hKL As Long, ByVal lpszReding As String,_
ByVal dwStyle As Long, ByVal lpszRegisterAs_
String) As Long
Private Sub Label6_Click()
Dim hKL As Long
Dim lpszReading As String '単語の読み
Dim lpszRegister As String '単語の語句
Dim dwStyle As Long '単語の品詞

  hKL = GetKeyboardLayout()
lpszReading = Text1.Text 'Text1に入力された            単語をlpszReadingに格納
lpszRegister = Text1.Text 'Text1に入力された            単語をlpszRegisuterに格納
ImmRegisterWord hKL, lpszReading, dwStyle,       lpszRegister '読み・語句をIME辞書に登録
End Sub
です。よろしくお願いします。

A 回答 (9件)

ゼロでしたか。


エラーというわけではないのですが、

lngCnt = ImmGetRegisterWordStyle(hkl, 0, udtStyle(0))
で取得できる「lngCnt」は「使用可能な品詞の数」をあらわしております。

つまりユーザ辞書に登録する方法がこれまでやってきた方法では無理なような気がします。

手作業ではユーザ辞書の登録は可能なのですよね?
そのときに「品詞」は選択可能ですよね?
(品詞とは名詞とかの言葉の種類を表す言葉です)
その品詞を数値化した値を取得する前に「いくつ品詞が登録されているか」を調べてそれが「ゼロ」だといっているので。。。

ちなみに私のIME2002では30近くの品詞が出てきます。

IME2003とのことなので何か違いがあるのでしょうか。。。
大変申し訳ないですが、当方にはIME2003の実行環境がないためそれを確認することができません。
ここまできて解決できないのはふに落ちない部分もあるのですが。。。
ネットで少し調べて見ます。
良い回答が見つかればよいのですが。。。

ちなみに
ReDim udtStyle(1 To lngCnt)
でのエラーは
lngCntがゼロであるため
ReDim udtStyle(1 To 0)
となり「1から0までを確保せよ」というのは矛盾があるのでエラーとなっているわけです。。。

この回答への補足

手作業でのユーザ辞書の登録は可能です。品詞も30個以上出ていて、ちゃんと選択も出来、登録されます。細かい部分まで色々とありがとうございます。私なりにも調べてみようと思います。

補足日時:2005/12/20 15:06
    • good
    • 0

lngCnt = ImmGetRegisterWordStyle(hkl, 0, udtStyle(0))


の行の後に
Msgbox lngCnt
を挿入して実行してみてください。

この回答への補足

実行してみたところ、「0」と出ました。エラーということでしょうか?よろしくお願いします。

補足日時:2005/12/20 12:50
    • good
    • 0

自己のサイトへのリンクが許されないということでサンプルが削除されてしまいましたので、ソースコードを記入します。



今までの原因は品詞の値が不適当だったことが原因だと思います。
以下のサンプルでは品詞の値を取得し、それを使用するようになっています。

【前提】
Form1の中にTextBoxを2つ(「Text1」「txtHinsi」)とListBox「List1」を設置してください。

【使い方】
1.Text1に登録文字を入れて「エンター」を押下
2.「エラー」と表示されるようならList1の中から適当に選択して再度Text1で「エンター」を押下
3.「成功」と表示されたならユーザ辞書で確認

【Form内コード】
Option Explicit

Private Declare Function GetKeyboardLayout Lib "user32" (ByVal idThread As Long) As Long
Private Declare Function ImmRegisterWord Lib "imm32.dll" Alias "ImmRegisterWordA" _
(ByVal hkl As Long, _
ByVal lpszReding As String, _
ByVal dwStyle As Long, _
ByVal lpszRegister As String) As Long

Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" ( _
ByVal dwFlag As Long, lpSource As Any, ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, ByVal lpBuffer As String, _
ByVal nSize As Long, Arguments As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100

Private Declare Function ImmGetRegisterWordStyle Lib "imm32.dll" Alias "ImmGetRegisterWordStyleA" ( _
ByVal hkl As Long, _
ByVal nItem As Long, _
lpStyleBuf As STYLEBUF) As Long
Private Type STYLEBUF
dwStyle As Long
szDescription(31) As Byte
End Type

Private Sub Form_Load()

Dim hkl As Long
Dim lngCnt As Long
Dim lngR As Long
Dim udtStyle() As STYLEBUF
Dim i As Long

ReDim udtStyle(0)

hkl = GetKeyboardLayout(0)
lngCnt = ImmGetRegisterWordStyle(hkl, 0, udtStyle(0))

ReDim udtStyle(1 To lngCnt)

List1.Clear
lngR = ImmGetRegisterWordStyle(hkl, lngCnt, udtStyle(1))
For i = 1 To lngCnt
List1.AddItem "&h" & Hex(udtStyle(i).dwStyle) & "," & StrConv(udtStyle(i).szDescription, vbUnicode)
Next

txtHinsi.Text = "&h" & Hex(udtStyle(1).dwStyle)

End Sub

Private Sub List1_Click()
txtHinsi.Text = Left(List1.Text, 10)
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim hkl As Long
Dim lpszReading As String
Dim lpszRegister As String
Dim dwStyle As Long
Dim lngR As Long
Dim lngR2 As Long
Dim strBuff As String

If KeyCode = vbKeyReturn Then
hkl = GetKeyboardLayout(0)
lpszReading = Text1.Text
lpszRegister = Text1.Text

dwStyle = CLng(txtHinsi.Text)

lngR = ImmRegisterWord(hkl, lpszReading, dwStyle, lpszRegister)

If lngR = 0 Then
MsgBox "エラー"
Else
MsgBox "成功"
End If

End If

End Sub

この回答への補足

ソースコードありがとうございます。実行してみたところ、
ReDim udtStyle(1 To lngCnt)
の部分で「インデックスが有効範囲にありません」と出て変更してみたりしたのですが、リストボックスに品詞が表示されなかったりと、どの部分を変更すれば実行できるのでしょうか?何度もすみません。よろしくお願いします。

補足日時:2005/12/19 19:27
    • good
    • 0

#1です。



1つめは「GetKeyboardLayout」の戻り値ということで「hKL」の値
2つめは「ImmRegisterWord」の戻り値ということで以下のようにして調べてみてください。

「ImmRegisterWord hKL, lpszReading, dwStyle, lpszRegister」
のところを
「Msgbox ImmRegisterWord(hKL, lpszReading, dwStyle, lpszRegister)」
と変更して実行し、表示された値

上記で調べた値のことです。

この回答への補足

ありがとうございます。戻り値は「0」と出ました。

補足日時:2005/12/14 20:33
    • good
    • 0

#1です。



APIを2つ使用していますが、それらの戻り値を教えてもらえませんか?
    • good
    • 0

#1です。



WindowsのバージョンとIMEのバージョンを教えてもらえませんか?

ちなみに私は
WindowsXP SP1
IME 2002 ver8.1
です。

この回答への補足

WindowsXP SP1
IME 2003 ver9.0です。
すみません。戻り値とはどれのことなのでしょうか?

補足日時:2005/12/14 16:04
    • good
    • 0

#1です。



できませんでしたか。。。
何ででしょうか????
単語は「ユーザー辞書」に登録されます。

「プログラムを文字確定のEnterキーを押したときに実行されるように」
これは思われているとおりで可能です。
使用するイベントは「KeyDown」あたりでしょうか。

この回答への補足

 

補足日時:2005/12/13 23:15
    • good
    • 0

#1です。


あと、これは転記時の間違いだと思うのですが、
2行目(Lib "user32" (ByVal idThread As Long) As Long)の最後にある「_(アンダーバー)」と
6行目(ByVal dwStyle As Long, ByVal lpszRegisterAs)の最後の「As」の手前にスペースが無い
の2点も修正しております。
(念のため。。。)
    • good
    • 0

私の場合は普通に登録されましたよ?


ソースの中で変えた点としては

hKL = GetKeyboardLayout()

hKL = GetKeyboardLayout(0)
とし、

dwStyle=1
を追加しました。

この回答への補足

ありがとうございます。やってみましたが、うまくできなくて。登録した単語はユーザー辞書というところに登録されると思っていたのですが、違うのでしょうか?あと、このプログラムを文字確定のEnterキーを押したときに実行されるように、
If keycode=vbkeyReturn Then
載せたプログラム
End If
としたのですが、これはできないのでしょうか?

補足日時:2005/12/13 08:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!