• 締切済み

keycodeについて

現在、スクリーンキーボードを作っています。それに、予測機能も付けたいと思っています。今取り組んでいるプログラムは、テキストファイルにある程度の単語を入れておき、最初に"あ"と入力したら変数aに格納し、ピクチャーボックスに"あ"から始まる単語を表示します。次に"い"と入力したら、変数aは"あい"となるようにし、テキストファイルから"あい"から始まる単語を検索し表示するようにしたいと思っています。 keyの呼出は下のプログラムで行っています↓↓ private Sub Command1_Click() Call sSetSendKeys(vbKeyI, 0, 0) endif 予測機能のプログラムとしては、 Private Sub Form_KeyPress(KeyAscii As Integer) Dim i As Integer:Dim result As Integer a = a & Chr(KeyAscii) Picture1.Print a For i = 0 To 8 result = t(i) Like (a & "*") If result = True Then Picture1.Print t(i) End If Next i End Sub というプログラムを応用して作っていこうと考えています。教えていただきたいのは「Chr(Ascii)」の部分をvbkeyを使いたいのですが、「vbkeyA」と入れてみたら、値65が出てしまい、どのようなプログラムにすれば"あ"を表示させることが出来るでしょうか?よろしくお願いします。

みんなの回答

回答No.3

繰り返しになりますが。 IMEがONの場合、確定が押されないとVBにはその入力が反映されないとおもうのですが…。 あくまでも私の認識ですが、 *キーボードが押される→物理的にどのキーが押されたかは把握可能。 *IMEによる(かな・漢字などへの)変換→変換中の文字列は、IMEの預かり扱いになるため、確定するまでプログラムでは内容を把握できない。 *変換後の文字列をプログラム(テキストボックスなど)に送信。 「変換確定した文字列」はプログラムで把握可能。 あ。そうだ。ブラウザで文字を入力するときに、予測変換と似た感じで入力候補が出る場合がありますが、その場合も文字を確定しないと候補が出てきませんよね? 要するに、「予測変換」を行いたいのであれば、IME自体をプログラムから操作する必要があるんじゃないかと思うんですが…。

回答No.2

えっと…確認なんですが、 「Private Sub Form_KeyPress(KeyAscii As Integer)」 を応用してとありますが、 そのプログラム、単体で動作確認できているのでしょうか?(特に日本語入力のとき) 「予測変換」については、どうやって実現するか見当もつかないので…。 IMEがONの場合、確定が押されないとVBにはその入力が反映されないとおもうのですが…。

mina5939
質問者

補足

そのプログラム単体では動きません。モジュールで、 Public Function sSetSendKeys~  Call keybd_event~ End Function Public Sub sKeyEventSet~   ~~~~~ End Sub 等をしています。日本語入力では得に何をしたかというのはなく、IMEをオンにするだけで、未確定状態の文字がテキストボックスにでるようになっています。文字が未確定のまま予測をしていきたいと思っています。なかなか伝わらなくてすみません。

回答No.1

まず、vbKey~というのは、文字コードではなく、 「物理的なキーに対応した」コードです。なので、"A" と "a" では同じ値になります。 意味合い自体が違うので、単純に変換する仕組みはないはずです。必要なら、MSDNの「キーコード定数」とANSIコードを突き合わせて変換の関数を自作するとかするしかないのでは? ちなみに、私なら単純にこれでいくと思います。 private Sub Command1_Click() Call sSetSendKeys(vbKeyI, 0, 0) Call Form_KeyPress(Chr("I")) end if 素朴な疑問で、この「予測機能」のプログラムが日本語入力時にどう対応するのか(KeyPressイベントは"あい"じゃなく"ai"としか来ないのでは?)とかあるのですが…。

mina5939
質問者

補足

回答ありがとうございます。MSDNのキーコード定数とANSIコードを合わせて変換の関数を作るということはもう少し詳しく教えていただけないでしょうか。VBについてあまり詳しくないので、すみません。 予測についてなんですけど、プロパティでIMEModeを全角ひらがなにしているので"あい"と出ています。質問の時のプログラムは、KeyPressだったんですけど、実際はKeyDown(Keycode As Integer)となっています。言っていることがわけ分からなかったらすみません。

関連するQ&A

  • VB2005での画像処理

    各ピクセルの色情報を取得し,そのままコピーするプログラムです. 同じ大きさのPictureBox1とPictureBox2,それとButton1があります. エラーや警告は出ませんが,Button1をクリックしてもまったく動きません. 最終的にはPictureBox1を画像処理してPictureBox2に結果を表示させたいのですが,そのままコピーも出来ないため原因を探しています. A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) ではだめなのでしょうか.ご教授ください. -----以下プログラム------ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim j As Integer Dim A As Integer Dim picture1 As New Bitmap(PictureBox1.Image) Dim picture2 As New Bitmap(PictureBox2.Image) For j = 0 To PictureBox1.Width - 1 For i = 0 To PictureBox1.Height - 1 A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) Next Next End Sub

  • DLLの利用について

    現在、VCで作成したDLLをVB使うということを行っています。 概要は、VBの方で定義した配列に1~9の数字を代入し、その和を求めるというものです。 DLLに値を渡す際は参照による引渡しをし、DLLで変数の変更を行いたいんです。 しかしその変数の変更がうまくいかないんです。 どこがまずいのでしょうか? プログラム内容は以下に示します。 よろしくお願いします。 *****VBのプログラム***** Option Explicit Private Declare Sub Sum Lib "test.dll" (aa as Integer, bb as Integer) Private Sub Command1_Click() Dim a(9) As Integer  '1~9の値の代入先 Dim b As integer   '和 Dim I As Integer For I = 0 To 9 a(I) = I + 1 Next I b = 0 Sum a, b  'DLLでの計算 MsgBox (b) '結果表示 End Sub *****DLLの中身***** _declspec(dllexport) void _stdcall Sum(short *aa, short bb) { int i; for ( i=0; i<=9; i++){ bb=bb+aa[i]; } } *****モジュール定義内容***** EXPORTS Sum

  • 配列の値を渡す

    (VB.NET2003) Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click Dim a(0) As Integer ・・・略 IF ・・・ a(0) = 1 ←"この値をピクチャーボックス2へ渡す" ・・・略 End Sub Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click Dim b(0) As Integer ・・・略 IF ・・・ b(0) = 1 IF b(0) >= a(0) Then ←"ココにa(0)の値を渡す" このプログラムは深く考えなくていいです。 IF文を使ってるから・・・など。 ・・・略 End Sub 上記の通り、ピクチャーボックス1、a1(0)の値を、 ピクチャーボックス2の処理にa(0)の値を渡す"プログラム"を教えてください┏○

  • 配列を関数に渡す方法

    VB6.0のプログラムで質問があるのですが 下のプログラムのように配列num、num1を関数AAAに 渡したいと思うのですがどうすればいいのでしょうか? よろしくお願いいたします。 Option Explicit Private num(10) As Integer Private num1(10) As Integer Private Sub Write_Click()    AAA(num)    AAA(num1) End Sub Private Function AAA(???)    Dim i As Integer    For i = 1 To 10       ???(i) = i    Next i End Function

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • VBAで行数を数えてテキストデータにコピーしたい。

    エクセルの実行ボタンを押すとアクティブシートにあるデータのA7から空白までの行数を数えて、その行数と同じ分、テキストデータをSQLテキストファイルにコピーしたいのですが、うまくいきません。 どなたか分かる方教えてください。 出来れば、下記のVBAを生かして組み込みたいです。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim myDate As String Dim myPath As String Dim NewPath As String Dim FNo As Integer Dim Ar(1) As String Dim SqlData As String Dim i As Integer Dim j As Integer '★配列にsqlファイルのタイトルを代入★ Ar(0) = "TEST1.sql" Ar(1) = "TEST2.Sql" '★sqlデータの内容を入れる★ sqlData0 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_a" & Chr(13) & Chr(10) SqlData1 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_b" & Chr(13) & Chr(10) & "testdata_c" myDate = Format(Date, "yyyymmdd") myPath = ThisWorkbook.Path NewPath = myPath & "\" & myDate ↑VBAは省略して途中まで記載しました。

  • DLLの利用について

    現在、VCで作成したDLLをVB使うということを行っています。 概要は、VBの方で定義した配列に1~9の数字を代入し、その和を求めるというものです。 DLLに値を渡す際は参照による引渡しをし、DLLで変数の変更を行いたいんです。 しかしその変数の変更がうまくいかないんです。 どこがまずいのでしょうか? プログラム内容は以下に示します。 よろしくお願いします。 *****VBのプログラム***** Option Explicit Private Declare Sub Sum Lib "test.dll" (aa, bb) Private Sub Command1_Click() Dim a(9) As Integer  '1~9の値の代入先 Dim b As integer   '和 Dim I As Integer For I = 0 To 9 a(I) = I + 1 Next I b = 0 Sum a, b  'DLLでの計算 MsgBox (b) '結果表示 End Sub *****DLLの中身***** _declspec(dllexport) void _stdcall Sum(short *aa, short bb) { int i; for ( i=0; i<=9; i++){ bb=bb+aa[i]; } } *****モジュール定義内容***** EXPORTS Sum

  • プログラムについて

    初心者の質問ですみません。 関数の読み出しについてですが、 A1実施→X1となり、X1をa()に代入する。 これを数回ループする場合、aのデータを他の関数で読み出し 変数に代入したい場合どのような記述が良いでしょうか? sub test1() Dim i,X as integer Dim A(10) as integer Dim a(10) as integer For i = 0 to 10 X = A(i)+300 a(i)=X next i End sub sub test2() ※ここにどのように記載すればa(i)を読み出せますか? End sub

  • Mid関数(2)

    VB6.0でタイピングソフトを作成しています。KeyPressの入力判定で、入力された文字とLabel1に表示されている文字が一緒なら、その文字を消すという処理なんですが、 Private Sub Form_KeyPress(KeyAscii As Integer) Label1.Caption = "taipingu" If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then Dim ss As String ss = Label1.Caption Mid(ss, z, 1) = " " Label1.Caption = ss z = z + 1 End if というやり方を教えていただいてやってみたのですが、 「If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then」の部分で 「プロシージャの呼び出し、または引数が不正です」 というエラーが出てしまいます。しかも、このエラーが出ずに実行がうまくいくときもあります。 何故このエラーが出るのか、分かる方お願いします。