|
分類:[VB.NET/VB2005 以降]
※投稿させて頂きましたがうまく投稿できていなかったようなので再投稿させて頂きます。
重複していたらすぐにこちらを削除致します。
Windowsの設定 - キーボードの詳細設定 - 『アプリウィンドウごとに異なる入力方式を設定する』にチェックを入れない状態で
IMEモードを切り替える方法をご教示頂けないでしょうか。
上記設定はお客様都合で変更することができません。
色々と調べてIMEモードの切り替え方法は何通りかあったので見よう見まねで実装しましたが反映されず困っています。
◆環境
・WindowsServer 2019
・VB 2019
・Grapecity Inputmanを使用
◆現状のコード
'Declareステートメント
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal Handle As IntPtr) As IntPtr
Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal himc As IntPtr, <MarshalAs(UnmanagedType.Bool)> ByVal fOpen As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
Private Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal himc As IntPtr, ByRef lpdw As Integer, ByRef lpdw2 As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
Private Declare Function ImmSetConversionStatus Lib "imm32.dll" (ByVal himc As IntPtr, ByVal dw1 As Integer, ByVal dw2 As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
'英数字入力モード
Private Const IME_CMODE_ALPHANUMERIC As Integer = &H0
'言語依存入力モード
Private Const IME_CMODE_NATIVE As Integer = &H1
'日本語入力モード
Private Const IME_CMODE_JAPANESE As Integer = IME_CMODE_NATIVE
'カタカナ入力モード
Private Const IME_CMODE_KATAKANA As Integer = &H2
'言語入力モード
Private Const IME_CMODE_LANGUAGE As Integer = &H3
'全角入力モード
Private Const IME_CMODE_FULLSHAPE As Integer = &H8
'ローマ字入力モード
Private Const IME_CMODE_ROMAN As Integer = &H10
'無変換モード
Private Const IME_SMODE_NONE As Integer = &H0
'複数文字変換モード
Private Const IME_SMODE_PLAURALCLAUSE As Integer = &H1
'単一文字変換モード
Private Const IME_SMODE_SINGLECONVERT As Integer = &H2
'自動変換モード
Private Const IME_SMODE_AUTOMATIC As Integer = &H4
'IME_SMODE_PHRASEPREDICT
Private Const IME_SMODE_PHRASEPREDICT As Integer = &H8
Private Sub ChangeImeMode(ByVal handle As IntPtr, ByVal imeMode As ImeMode)
Dim lngInputContextHandle As IntPtr
Dim lngStatusIMEConversion As Integer
Dim lngWin32apiResultCode As Boolean
lngInputContextHandle = ImmGetContext(handle)
If lngInputContextHandle <> New IntPtr(0) Then
lngWin32apiResultCode = ImmSetOpenStatus(lngInputContextHandle, True)
Select Case imeMode
Case ImeMode.AlphaFull '全角英数字
lngStatusIMEConversion = IME_CMODE_FULLSHAPE
Case ImeMode.Hiragana '全角ひらがな
lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_FULLSHAPE
Case ImeMode.Katakana '全角カナ
lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_FULLSHAPE Or IME_CMODE_KATAKANA
Case ImeMode.KatakanaHalf '半角カナ
lngStatusIMEConversion = IME_CMODE_NATIVE Or IME_CMODE_KATAKANA
Case Else
lngWin32apiResultCode = ImmSetOpenStatus(lngInputContextHandle, False)
lngWin32apiResultCode = ImmReleaseContext(handle, lngInputContextHandle)
Exit Sub
End Select
lngWin32apiResultCode = ImmSetConversionStatus(lngInputContextHandle, lngStatusIMEConversion, IME_SMODE_AUTOMATIC)
lngWin32apiResultCode = ImmReleaseContext(handle, lngInputContextHandle)
End If
End Sub
===================================================================================
上記コードに対し、コントロールにフォーカスがあたったタイミングで
『ChangeImeMode(Me.Handle, Me.ImeMode)』を渡しています。
例えばImeModeが半角カナのコントロールにフォーカスをあてたらImeも半角カナに
変換したいといった流れです。
===================================================================================
|