
テキストボックスに文字を入力して、確定と同時に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件)
- 最新から表示
- 回答順に表示
No.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:06No.7
- 回答日時:
自己のサイトへのリンクが許されないということでサンプルが削除されてしまいましたので、ソースコードを記入します。
今までの原因は品詞の値が不適当だったことが原因だと思います。
以下のサンプルでは品詞の値を取得し、それを使用するようになっています。
【前提】
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)
の部分で「インデックスが有効範囲にありません」と出て変更してみたりしたのですが、リストボックスに品詞が表示されなかったりと、どの部分を変更すれば実行できるのでしょうか?何度もすみません。よろしくお願いします。
No.6
- 回答日時:
#1です。
1つめは「GetKeyboardLayout」の戻り値ということで「hKL」の値
2つめは「ImmRegisterWord」の戻り値ということで以下のようにして調べてみてください。
「ImmRegisterWord hKL, lpszReading, dwStyle, lpszRegister」
のところを
「Msgbox ImmRegisterWord(hKL, lpszReading, dwStyle, lpszRegister)」
と変更して実行し、表示された値
上記で調べた値のことです。
No.2
- 回答日時:
#1です。
あと、これは転記時の間違いだと思うのですが、
2行目(Lib "user32" (ByVal idThread As Long) As Long)の最後にある「_(アンダーバー)」と
6行目(ByVal dwStyle As Long, ByVal lpszRegisterAs)の最後の「As」の手前にスペースが無い
の2点も修正しております。
(念のため。。。)
No.1
- 回答日時:
私の場合は普通に登録されましたよ?
ソースの中で変えた点としては
hKL = GetKeyboardLayout()
を
hKL = GetKeyboardLayout(0)
とし、
dwStyle=1
を追加しました。
この回答への補足
ありがとうございます。やってみましたが、うまくできなくて。登録した単語はユーザー辞書というところに登録されると思っていたのですが、違うのでしょうか?あと、このプログラムを文字確定のEnterキーを押したときに実行されるように、
If keycode=vbkeyReturn Then
載せたプログラム
End If
としたのですが、これはできないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
On ErrorでエラーNoが0
-
【VBA】ワークブックを開く時に...
-
.VBSだとADODBのプロバイダが見...
-
ASPでこんなエラーが出たんです...
-
お助けください!VBAのファイル...
-
mailstorehomeのエクスポートで...
-
pythonのopenpyxlについて
-
Excel VBA のFunctionプロシー...
-
VBA データ(特定値)のある最...
-
バッチファイルで、あるスクリ...
-
ステートメントが見つかりません
-
【Access】Excelインポート時に...
-
VB6 MSFlexGrid行数指定について
-
VBAのリストボックスで、横スク...
-
マクロの「SaveAs」でエラーが...
-
レコード登録時に「演算子があ...
-
実行時エラー '8021'とはどんな...
-
ある1人の友達のLINEで、少しの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
On ErrorでエラーNoが0
-
VBA データ(特定値)のある最...
-
インポート時のエラー「データ...
-
マクロで"#N/A"のエラー行を削...
-
VBAのリストボックスで、横スク...
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
Filter関数を用いた結果、何も...
-
文字列内で括弧を使うには
-
【VB.NET】 パワポ操作を非表示で
-
レコード登録時に「演算子があ...
おすすめ情報