コンボボックスでIME入力モードを使用不可にしていても有効になってしまう場合の対処方法
-
解説
AccessでコンボボックスのIME入力モードを使用不可にしている場合でも、勝手に有効になってしまうバグは有名です。
ちょっと2007を使う機会があったので直っているかと思い、やってみると直っていない、Microsoftは直す気ないのかね。仕方がないのでAPIを使って制御することにします。(ある程度汎用的に作ってあります)
-
サンプル
標準モジュール
Option Compare Database Option Explicit Private Const IME_CMODE_ALPHANUMERIC As Long = &H0 Private Const IME_CMODE_NATIVE As Long = &H1 Private Const IME_CMODE_CHINESE As Long = IME_CMODE_NATIVE Private Const IME_CMODE_HANGEUL As Long = IME_CMODE_NATIVE Private Const IME_CMODE_HANGUL As Long = IME_CMODE_NATIVE Private Const IME_CMODE_JAPANESE As Long = IME_CMODE_NATIVE Private Const IME_CMODE_KATAKANA As Long = &H2 Private Const IME_CMODE_LANGUAGE As Long = &H3 Private Const IME_CMODE_FULLSHAPE As Long = &H8 Private Const IME_CMODE_ROMAN As Long = &H10 Private Const IME_CMODE_CHARCODE As Long = &H20 Private Const IME_CMODE_HANJACONVERT As Long = &H40 Private Const IME_CMODE_SOFTKBD As Long = &H80 Private Const IME_CMODE_NOCONVERSION As Long = &H100 Private Const IME_CMODE_EUDC As Long = &H200 Private Const IME_CMODE_SYMBOL As Long = &H400 Private Const IME_CMODE_FIXED As Long = &H800 Private Const IME_CMODE_RESERVED As Long = &HF0000000 Private Const IME_SMODE_AUTOMATIC As Long = &H4 Public Enum IME_MODE IME_NONE = 0 'なし IME_HIRAGANA = 1 '全角ひらがな IME_KATAKANA = 2 '全角カタカナ IME_WIDE = 3 '全角英数 End Enum Private Declare Function GetFocus Lib "user32.dll" () As Long Private Declare Function ImmGetContext Lib "Imm32.dll" _ (ByVal hWnd As Long) As Long Private Declare Function ImmReleaseContext Lib "Imm32.dll" _ (ByVal hWnd As Long, _ ByVal hIMC As Long) As Long Private Declare Function ImmSetConversionStatus Lib "Imm32.dll" _ (ByVal hIMC As Long, _ ByVal fdwConversion As Long, _ ByVal fdwSentence As Long) As Long Private Declare Function ImmSetOpenStatus Lib "Imm32.dll" _ (ByVal hIMC As Long, _ ByVal fOpen As Integer) As Long Public Function SetIMEMode(ByVal Mode As IME_MODE) As Boolean Dim WindowHandle As Long Dim InputMethodManagerHandle As Long Dim Conversion As Long SetIMEMode = False WindowHandle = GetFocus() If WindowHandle = 0 Then Exit Function End If InputMethodManagerHandle = ImmGetContext(WindowHandle) If Mode <> 0 Then ImmSetOpenStatus InputMethodManagerHandle, True Select Case Mode Case IME_HIRAGANA Conversion = IME_CMODE_NATIVE Or _ IME_CMODE_FULLSHAPE Case IME_KATAKANA Conversion = IME_CMODE_NATIVE Or _ IME_CMODE_KATAKANA Or _ IME_CMODE_FULLSHAPE Case IME_WIDE Conversion = IME_CMODE_FULLSHAPE End Select ImmSetConversionStatus InputMethodManagerHandle, _ Conversion, _ IME_SMODE_AUTOMATIC Else ImmSetOpenStatus InputMethodManagerHandle, False End If ImmReleaseContext WindowHandle, InputMethodManagerHandle SetIMEMode = True End Function
使用方法は
SetIMEMode IME_NONE
と、なります。
-
その他
97はType Enumが使えないのでConst宣言する必要があります。
AccessのVBAおよびAPIの知識が必要です。
スポンサーリンク
スポンサーリンク
説明がわからないなどありましたらお問い合わせでお知らせください。
ここに掲載された情報を使用したことによって発生した、いかなる損害に対しても
管理者である雅は一切責任を負いません。