- - PR -
漢字入力とカナ(半角)表示
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-09-02 14:55
VB.NETでプログラム作成しています。
氏名漢字フィールドに入力すると同時に、氏名カナフィールド(半角)に表示する方法はありますか。 |
|
投稿日時: 2004-09-02 15:29
確かGrapCityのInputMan for .NETにそのような機能があったと思いますよ。
http://www.grapecity.com/japan/support/database/P7_254.htm 「こういったものを使わずに」と言われるとわからないですが… |
|
投稿日時: 2004-09-02 15:37
そうなんです。
InputManにあるのは知ってるんですが、 それは使わずにできないかと考えております。 |
|
投稿日時: 2004-09-02 16:32
市販コンポーネントを利用しないと、難しいと思いますよ。
まず自分で作る場合、IME等のFEPの前にキーボード入力などのイベントを フックし、かな入力、ローマ字入力の判断をした上で、ka→カとかの変換すれ ば理屈上は可能だと思いますが... (カット&ペーストには当然対応できません) 昔IME95だったか98だったかの時には、IMEの機能を直接呼び出して 実現可能だったかと思いますが、確か2000以降ではできなくなったように 思います。(ATOKではどうかわかりませんが) |
|
投稿日時: 2004-09-02 16:58
Public Class WR_Imm32
Public Enum GCL As Integer CONVERSION = &H1 REVERSECONVERSION = &H2 REVERSE_LENGTH = &H3 End Enum <DllImport("Imm32.dll", CharSet:=CharSet.Auto, EntryPoint:="ImmGetContext")> _ Public Shared Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, EntryPoint:="GetKeyboardLayout")> _ Public Shared Function GetKeyboardLayout(ByVal idThread As Integer) As IntPtr End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, EntryPoint:="ImmGetConversionList")> _ Public Shared 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", CharSet:=CharSet.Auto, EntryPoint:="ImmReleaseContext")> _ Public Shared Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Boolean End Function <StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _ Public 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 End Class こういうクラスを用意して、 Public Function GetReverseConversion(ByVal AText As String) As String() Dim hIMC As IntPtr = WR_Imm32.ImmGetContext(Me.Handle) Dim hKL As IntPtr = WR_Imm32.GetKeyboardLayout(0) Dim list As New WR_Imm32.CANDIDATELIST Dim dwSize As Integer = WR_Imm32.ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, WR_Imm32.GCL.REVERSE_LENGTH) Dim BufList As IntPtr = Marshal.AllocHGlobal(dwSize) WR_Imm32.ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, WR_Imm32.GCL.REVERSECONVERSION) Marshal.PtrToStructure(BufList, list) Dim buf(dwSize) As Byte Marshal.Copy(BufList, buf, 0, dwSize) Marshal.FreeHGlobal(BufList) Dim os As Integer = list.dwOffset Dim str As String = System.Text.Encoding.Unicode.GetString(buf, os, buf.Length - os - 3) Dim strList() As String = str.Split(New Char() {ControlChars.NullChar}) WR_Imm32.ImmReleaseContext(Me.Handle, hIMC) Return strList End Function こういう関数から呼び出す。この関数は、 Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click ComboBox1.Items.Clear() ComboBox1.Items.AddRange(GetReverseConversion(TextBox1.Text)) ComboBox1.SelectedIndex = 0 Label1.Text = "" Dim str As String For Each str In ComboBox1.Items Label1.Text &= str & ControlChars.CrLf Next End Sub こんな感じで使う。MS-IME2002, ATOK17で確認。 (原作:諸農氏) |
|
投稿日時: 2004-09-02 18:05
ありがとうございます。
少し手直しして使えそうです。 大変助かりました。 |
1