inkeditで全て英語に認識させたい。

タグの編集
投稿者 未来  (中学生) 投稿日時 2021/2/20 01:13:18
inkeditを使って字を認識させていますが、英語と日本語が混在してうまくいきません。書いた文字が必ず英語に認識される方法はありませんか?
投稿者 snowmansnow  (社会人) 投稿日時 2021/2/23 18:34:10
こんばんは、
普段は、るきお様達に教えてもらっている者です。

IMEをインストールしていると、それらの言語で認識できますが、
日本語環境では、英語も自動でインストールされてると、何かで見た事があります。
参考までに、自分の環境の認識エンジンを列挙されると宜しいと思います。
    Dim recto As String
    Dim recos As New InkRecognizers
    For i = 0 To recos.Count - 1
     recto = recto & vbCrLf & recos.Item(i).Name
    Next
    MsgBox recto
ユニコードで???の表示になるものは、セルにコピーすると読めると思いますし、
ユニコード表示のMSGBOXで検索すると、解決方法があると思います。

次にインストールされている各種言語の指定は、上記で確認したインデックス指定か、
LCIDという国別の数値の指定で、選択できます

   Dim recosj As IInkRecognizers
   Set InkEdit2.Recognizer = recos.Item(0)
   Set InkEdit3.Recognizer = recos.GetDefaultRecognizer(&H409)
   MsgBox InkEdit2.Recognizer.Name
   MsgBox InkEdit3.Recognizer.Name

'https://www.kanaya440.com/contents/script/vbs/others/lcid.html
よかったら試してみて下さい。

 
投稿者 snowmansnow  (社会人) 投稿日時 2021/2/27 11:53:51
こんにちは
ごめんなさい、未来さんはVBNETでないかと思います。私は普段VBAです。
webのC#を参考にVBNETにしてみました。
フォームに、ボタン2つ、リストボックス1つ配置します。
蛇足かもしれませんが、参考にしてみて下さい。
Imports System.Windows.Forms
Imports System.IO
Imports Microsoft.Ink


Public Class Form1

    'http://blog.wdnet.jp/tech/archives/148 

    Private Sub Button2_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button2.Click
        recognizerList.DisplayMember = "Name"
        Dim recognizers As Recognizers = New Recognizers()
        Dim recognizersEnum As Recognizers.RecognizersEnumerator = recognizers.GetEnumerator()
        recognizerList.Items.Clear()

        While recognizersEnum.MoveNext()
            Dim recognizer As Recognizer = CType(recognizersEnum.Current, Recognizer)
            recognizerList.Items.Add(recognizer)
        End While
    End Sub
    Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
        If recognizerList.SelectedIndex = -1 Then
            MessageBox.Show("手書き認識エンジンを選択してください")
            Return
        End If

        Dim recognizer As Recognizer = CType(recognizerList.SelectedItem, Recognizer)
        InkEdit1.Recognizer = recognizer
        MessageBox.Show(recognizer.Name & "を設定しました")
    End Sub

End Class
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/27 17:29:43
VBA の場合と VB.NET の場合では若干異なるプログラムが必要になりますので、
質問時には、開発環境とそのバージョンも明示した方が良いですよ。>未来さん

正しい認識エンジンさえ選んであれば、ブロック体でも筆記体であっても、
英文として認識されるはずです。

そのための Recognizer の列挙コードを snowmansnow さんが紹介されていますが…
GetEnumerator を直接呼び出すのは稀なので(VBA でいうと IEnumVARIANT にあたる)、
コードを少し書き直してみました。横からすみません。

InkEdit の他に、ComboBox と ListBox を用意しておいてください。
ComboBox は認識エンジンを選択するもので、
ListBox は、そのエンジンがどの言語をサポートしているのかを確認するためのものです。

Imports Microsoft.Ink
Imports System.Globalization
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'ListBox1.DisplayMember = "Name" 
        'ListBox1.DisplayMember = "NativeName" 
        ListBox1.DisplayMember = "DisplayName"
        'ListBox1.DisplayMember = "EnglishName" 

        'ComboBox1.DisplayMember = "Id" 
        ComboBox1.DisplayMember = "Name"
        ComboBox1.DataSource = New Recognizers().OfType(Of Recognizer)().ToArray()
    End Sub
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        InkEdit1.Recognizer = TryCast(ComboBox1.SelectedItem, Recognizer)
        ListBox1.DataSource = InkEdit1.Recognizer.Languages.Select(AddressOf CultureInfo.GetCultureInfo).ToArray()
    End Sub
End Class



なお、既定では英語専用の手書き認識エンジンはインストールされていませんので、
必要に応じて追加してください。Windows 10 であれば、スタートメニューの
[設定]-[時刻と言語]-[言語]で確認できます。

投稿者 未来  (中学生) 投稿日時 2021/2/28 15:07:57
snowmansnowさん、魔界の仮面弁士さん
ありがとうございます。
自分が思うようには動きましたが、
言語を選択せず、
InkEdit1.Recognizer = ("Microsoft English (US) Handwriting Recognizer")
みたいな感じで設定はできないでしょうか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/28 18:05:13
> 言語を選択せず、
> InkEdit1.Recognizer = ("Microsoft English (US) Handwriting Recognizer")
> みたいな感じで設定はできないでしょうか。

ユーザー操作で指定しようが、プログラムから指定しようが、
「言語を選択する」という行為であることに変わりはないですよ?

Option Explicit
Private Enum LCID
    ja_jp = 1041
    en_us = 1033
End Enum

' VBA の場合 
Private Sub UserForm_Initialize()
    Set InkEdit1.Recognizer = CreateObject("MSInkAut.InkRecognizers").GetDefaultRecognizer(LCID.en_us)
End Sub

' VB.NET の場合 
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    InkEdit1.Recognizer = New Recognizers().GetDefaultRecognizer(LCID.en_us)
End Sub


上記では GetDefaultRecognizer から LCID 指定で検索しましたが、
他にも、列挙した Recognizer の Id や Name を調べるという手もあります。

{6d4087d7-61d2-495f-9293-5b7b1c3fceab} … Microsoft 日本語手書き認識エンジン
{6d1087d7-61d2-495f-9293-5b7b1c3fceab} … Microsoft English (US) Handwriting Recognizer
投稿者 snowmansnow  (社会人) 投稿日時 2021/2/28 18:05:45
こんにちは未来さん、仮面の魔界弁士様

VBAみたいに直接指定する事もできました。
inkeditに、「し」と入力してみて下さい。
 &H409指定なら「L」みたいな認識、
 &H411指定なら「し」みたいな認識になる事で、確認できると思います。
 

       Dim instance As New Recognizers
        Dim returnValue As Recognizer
        returnValue = instance.GetDefaultRecognizer(&H409) '英語 
   '    returnValue = instance.GetDefaultRecognizer(&H411) '日本語 

        'https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/ms569813(v%3dvs.85) 
        InkEdit1.Recognizer = returnValue
        MessageBox.Show(InkEdit1.Recognizer.ToString)
投稿者 snowmansnow  (社会人) 投稿日時 2021/2/28 18:08:50
こんにちは
魔界の仮面弁士様が回答されているのに気が付きませんでした
(画面を更新してませんでした)
割り込み、後書きみたいに見えてしまいますが、自分の環境で確認に時間がかかった為です。
ごめんなさい
投稿者 未来  (中学生) 投稿日時 2021/2/28 19:05:01
snowmansnowさん、魔界の仮面弁士さん
本当にありがとうございました。
ついにできました。
お二人のお蔭です。感謝しています。