
テキストボックスに文字を入力して、確定と同時に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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
if関数の順番 iserrorが認識さ...
-
VBA 空白行の削除
-
VBAでfunctionを利用しようとし...
-
OpenOffice Basicで簡単な関数...
-
UserForm1.Showでエラーになり...
-
On Error GoTo でエラーが発生...
-
ApplicationとWorksheetFunctio...
-
現在、HP作成業者さんがつく...
-
ExcelにSQLの結果を表示
-
WindowsのプロダクトIDを取得す...
-
検索Find処理を2重、3重とす...
-
インポート時のエラー「データ...
-
EnableWindow()後のGetLastError()
-
オブジェクト型の変数にフォー...
-
VBA データ(特定値)のある最...
-
実行時エラー'1004'の詳細と回...
-
VBA変数をFunction.VLookupの戻...
-
条件式について
-
エクセルVBAの二重ループについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報