入力されたローマ字ないしひらがなを、IMEで変換後の文章に置換する方法を探しています。
例:
きょうはあめです -> 今日は雨です
kyouhaamedesu -> 今日は雨です
誤変換でもかまいませんし、精度は問いません。漢字変換の方法を探しています。
よろしくお願いします。
回答ではありません・・・
http://vsug.jp/tabid/63/forumid/51/threadid/8461/scope/posts/Default.aspx
http://tsuge.astgate.biz/witchgarden/?C%23%20Tips%2FWitchPaper%A4%C7%BC%C2%C1%F5%A4%B7%A4%BFIME%C0%A9%B8%E6
あくまで、参考・・・
なかなか難しいようですが、できないわけではありません。
※ 因みに、私は使ったことありません。
以上。
VB6ですがサンプルがありました。
み〜くんパパの仕事部屋 - IME
http://www.mitene.or.jp/~sugisita/vb6_ime.html
このページの、「IMEの変換候補の取得」というところにあります。
VB6で試したところ、「きょうはあめです」と入力すると下記のような候補が取得できました。
今日は雨です
今日はあめです
今日は飴です
京は雨です
・
・
・
ありがとうございました。こんなに沢山関連サイトがあったんですね、検索させてしまって申し訳ありません・・・
上記のサイト、大変参考になりました。ありがとうございます。
お詫びに、自分なりの回答を記しますね。
動作確認: VB.NET 2008 Express Edition
---------
Option Explicit On
Imports System.Runtime.InteropServices
Module Hiragana2Kanji
Private Enum GCL_ENUM
GCL_CONVERSION = &H1
GCL_REVERSECONVERSION = &H2
GCL_REVERSE_LENGTH = &H3
End Enum
<DllImport("Imm32.dll")> _
Public Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr
End Function
<DllImport("Imm32.dll")> _
Public Function ImmGetConversionList(ByVal hKL As IntPtr, ByVal hIMC As IntPtr, ByVal lpSrc As String, ByVal lpDst As IntPtr, ByVal dwBufLen As Integer, ByVal uFlag As Integer) As Integer
End Function
<DllImport("Imm32.dll")> _
Public Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Integer
End Function
<StructLayout(LayoutKind.Sequential)> _
Private Class CANDIDATELIST
Public dwSize As Integer
Public dwStyle As Integer
Public dwCount As Integer
Public dwSelection As Integer
Public dwPageStart As Integer
Public dwPageSize As Integer
Public dwOffset As Integer
End Class
Public Function GetStr2KanjiList(ByVal text As String, ByVal hIMC As IntPtr) As String()
If text = "" Then Return ""
Dim hKL As IntPtr = System.Windows.Forms.InputLanguage.CurrentInputLanguage.Handle
Dim list As New CANDIDATELIST
Dim dwSize As Integer = ImmGetConversionList(hKL, hIMC, text, IntPtr.Zero, 0, GCL_ENUM.GCL_CONVERSION)
Dim BufList As IntPtr = Marshal.AllocHGlobal(dwSize)
ImmGetConversionList(hKL, hIMC, text, BufList, dwSize, GCL_ENUM.GCL_CONVERSION)
Marshal.PtrToStructure(BufList, list)
Dim buf As Byte() = New Byte(dwSize - 1) {}
Marshal.Copy(BufList, buf, 0, dwSize)
Marshal.FreeHGlobal(BufList)
Dim os As Integer = list.dwOffset
Dim str As String = System.Text.Encoding.[Default].GetString(buf, os, buf.Length - os - 3)
Dim par As Char() = vbNullChar.ToCharArray()
Dim strList As String() = str.Split(par)
Return strList
End Function
End Module
Public Class Form1
Dim hIMC As IntPtr
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
debug.writeline(GetStr2Kanji(TextBox1.Text, hIMC))
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
hIMC = ImmGetContext(Me.Handle)
ImmReleaseContext(Handle, hIMC)
End Sub
End Class
----------
ImmReleaseContextとImmGetContextをGetStr2KanjiList内で宣言してしまうと、二度目以降の試行のときにエラーがでてしまいます。
知識不足故、それを回避するためにこういう形にしてみました。