private const int WM_CHAR = 0x102;
private const int WM_IME_COMPOSITION = 0x10F;
private const int GCS_RESULTREADSTR = 0x0200;
// コンテキスト・ハンドルの取得
[DllImport("Imm32.dll")]
private static extern int ImmGetContext(int hWnd);
// コンテキスト・ハンドルの解放
[DllImport("Imm32.dll")]
private static extern int ImmReleaseContext(int hWnd, int hIMC);
// IMEより読みなどの文字列を取得する
[DllImport("Imm32.dll")]
private static extern int ImmGetCompositionString(int hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen);
// IMEの状態取得
[DllImport("Imm32.dll")]
private static extern int ImmGetOpenStatus(int hIMC);
Private Const WM_CHAR As Integer = &H102
Private Const WM_IME_COMPOSITION As Integer = &H10F
Private Const GCS_RESULTREADSTR As Integer = &H200
' コンテキスト・ハンドルの取得
<DllImport("Imm32.dll")> _
Private Shared Function ImmGetContext(ByVal hWnd As Integer) As Integer
End Function
' コンテキスト・ハンドルの解放
<DllImport("Imm32.dll")> _
Private Shared Function ImmReleaseContext(ByVal hWnd As Integer, ByVal hIMC As Integer) As Integer
End Function
' IMEから読みなどの文字列を取得する
<DllImport("Imm32.dll")> _
Private Shared Function ImmGetCompositionString(ByVal hIMC As Integer, ByVal dwIndex As Integer, ByVal lpBuf As StringBuilder, ByVal dwBufLen As Integer) As Integer
End Function
' IMEの状態取得
<DllImport("Imm32.dll")> _
Private Shared Function ImmGetOpenStatus(ByVal hIMC As Integer) As Integer
End Function
Protected m_enabled As Boolean = False ' メッセージの監視状態(On/Off)
Public Delegate Sub Converted(ByVal sender As System.Object, ByVal e As ConvertedEventArgs)
Public Event OnConverted As Converted
' コンストラクタ
Public Sub New(ByVal c As Control)
AssignHandle(c.Handle)
AddHandler c.HandleDestroyed, AddressOf OnHandleDestroyed
End Sub
Friend Sub OnHandleDestroyed(ByVal sender As Object, _
ByVal e As EventArgs)
ReleaseHandle()
End Sub
Public Property Enabled() As Boolean
Get
Return m_enabled
End Get
Set(ByVal value As Boolean)
m_enabled = value
End Set
End Property
' 読み取得対象コントロールのウィンドウ・プロシージャ
Protected Overloads Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Dim hIMC As Integer
Dim intLength As Integer
If m_enabled Then
Select Case m.Msg
Case WM_IME_COMPOSITION
Dim strResult As String = ""
Dim strYomi As String = ""
If (CUInt(m.LParam) And CUInt(GCS_RESULTREADSTR)) <> 0 Then
hIMC = ImmGetContext(Me.Handle.ToInt32())
' 読みの文字列
intLength = ImmGetCompositionString( _
hIMC, GCS_RESULTREADSTR, Nothing, 0)
If intLength > 0 Then
Dim temp As New StringBuilder(intLength)
ImmGetCompositionString(_
hIMC, GCS_RESULTREADSTR, temp, intLength)
strYomi = temp.ToString()
If strYomi.Length > intLength Then
strYomi = strYomi.Substring(0, intLength)
End If
' イベント起動
Dim ea As New ConvertedEventArgs( _
strYomi, strResult, False, intLength)
RaiseEvent OnConverted(Me, ea)
End If
ImmReleaseContext(Me.Handle.ToInt32(), hIMC)
End If
Exit Select
Case WM_CHAR: '半角英数字
hIMC = ImmGetContext(Me.Handle.ToInt32())
If ImmGetOpenStatus(hIMC) = 0 Then
Dim chr As Char = _
Convert.ToChar(m.WParam.ToInt32() And &HFF)
If m.WParam.ToInt32() >= 32 Then
'イベント起動
Dim str As String = chr.ToString()
Dim ea As ConvertedEventArgs = _
new ConvertedEventArgs(str, true, 1)
RaiseEvent OnConverted(Me, ea)
End If
End If
ImmReleaseContext(Me.Handle.ToInt32(), hIMC)
Exit Select
End Select
End If
MyBase.WndProc(m)
End Sub
End Class
string s = "";
if (ea.IsSingleChar) {
s = ea.FuriganaString;
} else {
s = Strings.StrConv(ea.FuriganaString, VbStrConv.Wide, 0x411);
}
// 読みをコントロールにセットする
targetYomiControl.Text += s;
}
}
' イベント引数
Public Class ConvertedEventArgs
Inherits EventArgs
Private yomi As String ' 読み
Private bSingle As Boolean ' 半角文字か
Private yomiLength As Integer = 0 ' 読みの文字数
Public Sub New(ByVal f As String, ByVal singleFlag As Boolean, ByVal friLen As Integer)
yomi = f
bSingle = singleFlag
yomiLength = friLen
End Sub
Public ReadOnly Property YomiString() As String
Get
Return yomi
End Get
End Property
Public ReadOnly Property YomiLen() As Integer
Get
Return yomiLength
End Get
End Property
Public ReadOnly Property IsSingleChar() As Boolean
Get
Return bSingle
End Get
End Property
End Class
' 読みを取得するクラス
Public Class ImeYomiConversion
' targetCtrl:日本語入力を行うコントロール
' yomiCtrl:読みをセットするコントロール
Public Sub New(ByVal targetCtrl As Control, ByVal yomiCtrl As Control)
targetControl = targetCtrl
Me.targetYomiControl = yomiCtrl
listner = New MsgListener(targetControl) ' サブクラス化
'日本語入力が確定したらイベントで通知
AddHandler listner.OnConverted, AddressOf EventConverted
End Sub
Public Property Enabled() As Boolean
' メッセージ監視のOn/Off
Get
Return listner.Enabled
End Get
' メッセージ監視状態
Set(ByVal value As Boolean)
listner.Enabled = value
End Set
End Property
' 変換処理が行われた
Private Sub EventConverted(ByVal sender As Object, ByVal ea As ConvertedEventArgs)
If targetControl.Text.Length = 0 Then
' 漢字入力のコントロールが空なら読みも空に
targetYomiControl.Text = ""
End If
Dim s As String = ""
If ea.IsSingleChar Then
s = ea.FuriganaString
Else
s = Strings.StrConv(ea.FuriganaString, VbStrConv.Wide, &H411)
End If
' 読みをコントロールにセットする
targetYomiControl.Text += s
End Sub
End Class
private yomiConv As ImeComposition.ImeYomiConversion
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
yomiConv = new ImeComposition.ImeYomiConversion(TextBox1, _
TextBox2)
End Sub
Private Sub TextBox1_Enter(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.Enter
yomiConv.Enabled = true
End Sub
Private Sub TextBox1_Leave(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.Leave
yomiConv.Enabled = false
End Sub
End Class