- PR -

imm32.dllで入力モードが切り替えできない(変換モードはできる)

1
投稿者投稿内容
6809
会議室デビュー日: 2006/12/05
投稿数: 5
投稿日時: 2007-03-15 11:56
IMEの入力モードと変換モードを切り替えたいのです。
サンプルコードを改修して、変換モードだけは切り替わるようになったのですが入力モードが変更できません。
2つのボタンで半角カナ無変換モードと、全角ひらがな自動変換モードを切り替えようとしています。


どなたか対応法をご教授下さい。宜しくお願いします。

Public Class Form1

Declare Function GetActiveWindow Lib "user32" () As Integer

Public Const IME_CMODE_NATIVE As Integer = &H1
Public Const IME_CMODE_CHINESE As Integer = IME_CMODE_NATIVE
Public Const IME_CMODE_HANGEUL As Integer = IME_CMODE_NATIVE
Public Const IME_CMODE_HANGUL As Integer = IME_CMODE_NATIVE

Public Enum IME_CMODE_ENUM As Integer
IME_CMODE_ALPHANUMERIC = &H0
IME_CMODE_JAPANESE = IME_CMODE_NATIVE
IME_CMODE_KATAKANA = &H2
IME_CMODE_LANGUAGE = &H3
IME_CMODE_FULLSHAPE = &H8
IME_CMODE_ROMAN = &H10
IME_CMODE_CHARCODE = &H20
IME_CMODE_HANJACONVERT = &H40
IME_CMODE_SOFTKBD = &H80
IME_CMODE_NOCONVERSION = &H100
IME_CMODE_EUDC = &H200
IME_CMODE_SYMBOL = &H400
IME_CMODE_FIXED = &H800
End Enum

Public Enum IME_SMODE_ENUM As Integer
IME_SMODE_NONE = &H0
IME_SMODE_PLAURALCLAUSE = &H1
IME_SMODE_SINGLECONVERT = &H2
IME_SMODE_AUTOMATIC = &H4
IME_SMODE_PHRASEPREDICT = &H8
IME_SMODE_CONVERSATION = &H10
End Enum

Public Declare Function ImmGetDefaultIMEWnd Lib "Imm32.dll" (ByVal hwnd As Integer) As Integer
Public Declare Function ImmGetContext Lib "Imm32.dll" (ByVal hwnd As Integer) As Integer
Public Declare Function ImmReleaseContext Lib "Imm32.dll" (ByVal hwnd As Integer, ByVal hIMC As Integer) As Integer
Public Declare Function ImmSetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Integer, ByVal fdwConversion As IME_CMODE_ENUM, ByVal fdwSentence As IME_SMODE_ENUM) As Integer
Public Declare Function ImmGetConversionStatus Lib "Imm32.dll" (ByVal hIMC As Integer, ByVal lpfdwConversion As IME_CMODE_ENUM, ByVal lpfdwSentence As IME_SMODE_ENUM) As Integer


Public Function SetIMEConversionStatus(ByVal hwnd As Integer, _
ByVal enmConversion As IME_CMODE_ENUM, _
ByVal enmSentence As IME_SMODE_ENUM) As Integer
Dim hwndIME As Integer
Dim hIMC As Integer

hwndIME = ImmGetDefaultIMEWnd(hwnd)

If hwndIME <> 0 Then
hIMC = ImmGetContext(hwndIME)
If hIMC <> 0 Then
SetIMEConversionStatus = ImmSetConversionStatus(hIMC, enmConversion, enmSentence)
ImmReleaseContext(hwndIME, hIMC)
End If
End If
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
REM 半角カナ無変換入力
SetIMEConversionStatus(GetActiveWindow, IME_CMODE_ENUM.IME_CMODE_KATAKANA, IME_SMODE_ENUM.IME_SMODE_NONE)
TextBox1.Focus()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
REM 全角ひらがな自動変換入力
SetIMEConversionStatus(GetActiveWindow, IME_CMODE_ENUM.IME_CMODE_FULLSHAPE Or _
IME_CMODE_ENUM.IME_CMODE_JAPANESE Or IME_CMODE_ENUM.IME_CMODE_ROMAN, IME_SMODE_ENUM.IME_SMODE_AUTOMATIC)
TextBox1.Focus()
End Sub

End Class
6809
会議室デビュー日: 2006/12/05
投稿数: 5
投稿日時: 2007-03-16 09:43
自宅の環境で同じソースで試したところ不可解な動作をしました。
職場の環境はwindows xp professional sp2で、Visual Basic 2005、自宅環境はwindows xp home sp2で、Visual Basic Express editionです。

自宅の方だと今度は入力モードが切り替わるのに変換モードが切り替わらないという現象が出ました。
環境によって動作が一定しないとなると業務アプリで使用することが困難になります。現状では、ImeModeでの入力モード切替だけで、変換モードの切り替えはネグるしかないのかなという状態です。
1

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