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
よかったら試してみて下さい。
 
    
    
普段は、るきお様達に教えてもらっている者です。
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つ配置します。
蛇足かもしれませんが、参考にしてみて下さい。
    
ごめんなさい、未来さんは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 Object, ByVal 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 Object, ByVal 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 は、そのエンジンがどの言語をサポートしているのかを確認するためのものです。
なお、既定では英語専用の手書き認識エンジンはインストールされていませんので、
必要に応じて追加してください。Windows 10 であれば、スタートメニューの
[設定]-[時刻と言語]-[言語]で確認できます。

    
    
質問時には、開発環境とそのバージョンも明示した方が良いですよ。>未来さん
正しい認識エンジンさえ選んであれば、ブロック体でも筆記体であっても、
英文として認識されるはずです。
そのための 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")
みたいな感じで設定はできないでしょうか。
    
ありがとうございます。
自分が思うようには動きましたが、
言語を選択せず、
InkEdit1.Recognizer = ("Microsoft English (US) Handwriting Recognizer")
みたいな感じで設定はできないでしょうか。
        投稿者 魔界の仮面弁士  (社会人)
        
        投稿日時 
            2021/2/28 18:05:13
        
    
    
        > 言語を選択せず、
> InkEdit1.Recognizer = ("Microsoft English (US) Handwriting Recognizer")
> みたいな感じで設定はできないでしょうか。
ユーザー操作で指定しようが、プログラムから指定しようが、
「言語を選択する」という行為であることに変わりはないですよ?
上記では GetDefaultRecognizer から LCID 指定で検索しましたが、
他にも、列挙した Recognizer の Id や Name を調べるという手もあります。
    
> 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
    {6d1087d7-61d2-495f-9293-5b7b1c3fceab} … Microsoft English (US) Handwriting Recognizer
        投稿者 snowmansnow  (社会人)
        
        投稿日時 
            2021/2/28 18:05:45
        
    
    
        こんにちは未来さん、仮面の魔界弁士様
VBAみたいに直接指定する事もできました。
inkeditに、「し」と入力してみて下さい。
&H409指定なら「L」みたいな認識、
&H411指定なら「し」みたいな認識になる事で、確認できると思います。
 
    
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さん、魔界の仮面弁士さん
本当にありがとうございました。
ついにできました。
お二人のお蔭です。感謝しています。
    
本当にありがとうございました。
ついにできました。
お二人のお蔭です。感謝しています。