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さん、魔界の仮面弁士さん
本当にありがとうございました。
ついにできました。
お二人のお蔭です。感謝しています。
本当にありがとうございました。
ついにできました。
お二人のお蔭です。感謝しています。