- PR -

漢字入力とカナ(半角)表示

1
投稿者投稿内容
あさけん
会議室デビュー日: 2003/06/30
投稿数: 6
投稿日時: 2004-09-02 14:55
VB.NETでプログラム作成しています。
氏名漢字フィールドに入力すると同時に、氏名カナフィールド(半角)に表示する方法はありますか。
ヨコヤマダ
会議室デビュー日: 2003/10/14
投稿数: 8
投稿日時: 2004-09-02 15:29
確かGrapCityのInputMan for .NETにそのような機能があったと思いますよ。

http://www.grapecity.com/japan/support/database/P7_254.htm

「こういったものを使わずに」と言われるとわからないですが…
あさけん
会議室デビュー日: 2003/06/30
投稿数: 6
投稿日時: 2004-09-02 15:37
そうなんです。
InputManにあるのは知ってるんですが、
それは使わずにできないかと考えております。
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-09-02 16:32
市販コンポーネントを利用しないと、難しいと思いますよ。

まず自分で作る場合、IME等のFEPの前にキーボード入力などのイベントを
フックし、かな入力、ローマ字入力の判断をした上で、ka→カとかの変換すれ
ば理屈上は可能だと思いますが...
(カット&ペーストには当然対応できません)

 昔IME95だったか98だったかの時には、IMEの機能を直接呼び出して
 実現可能だったかと思いますが、確か2000以降ではできなくなったように
 思います。(ATOKではどうかわかりませんが)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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で確認。
(原作:諸農氏)
あさけん
会議室デビュー日: 2003/06/30
投稿数: 6
投稿日時: 2004-09-02 18:05
ありがとうございます。

少し手直しして使えそうです。
大変助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)