none
IMEの予測候補を非表示にする方法 RRS feed

  • 質問

  • ExcelVBAでプログラムを作成しています。環境はWindows10,Office2019です。UserFormで問題を表示し,答えをTextBoxにひらがなで入力してもらうものを作っています。答えを入力してもらうときに予測入力の候補が表示されるので,それが解答のヒントにならないように非表示にしたいのです。プログラムを実行する前にIMEのプロパティの「予測入力を使用する」にあるチェックをはずすと非表示にできるのですが,ユーザーのPC操作の習熟度にばらつきがあり,ユーザーにその操作をしてもらわなくても済むようにプログラムでその処理をしたいと考え次のようにプログラムしました。

    imm32.dllのImmSetConversionStatusを使い,IME_SMODE_PHRASEPREDICTのビットをoffにするようにしました。すると変換候補予測が単語で表示されることはなくなったのですが,1文字入力したときに母音の場合はそのままひらがなになるのですが,子音の場合には例えば「か」と入力するときに「k」を入力した段階で「keyDown,kg,km,kindle」といった変換候補が出てくるようになりました。IMEのプロパティで「予測入力を使用する」のチェックをはずすと変換候補が完全に表示されなくなるのでそのようにしたいのですが,色々と試みましたが方法が見つかりません。方法をご存知の方がおられましたら,ご教示ください。また,「予測候補を表示するまでの文字数」はデフォルトは1のようですが,これを3,4といった長いものに変えても候補が表示されなくなるので,この文字数を変える方法がないかも調べたのですが,今のところ分かりませんでした。よろしくお願いします。


    • 編集済み GaiaHiro 2020年5月20日 5:48
    2020年5月20日 5:46

すべての返信

  • vb.netならサンプルあるけどVBAに変換するのはまず不可能

    MS IME限定ならダイアログ出して設定してねとお願いするするくらいは許容した方がいいのでは?

    Option Explicit
    'UIAutomationClient参照
    'Windows Script Host Object Model参照
    
    Private Sub CommandButton1_Click()
        Dim sh As New IWshRuntimeLibrary.WshShell
        Dim vHistory
        Dim vSystem
    
        On Error Resume Next
     
        vHistory = sh.RegRead("HKCU\Software\Microsoft\IME\15.0\IMEJP\MSIME\PredictionUseInputHistory")
        vSystem = sh.RegRead("HKCU\Software\Microsoft\IME\15.0\IMEJP\MSIME\PredictionUseSystemDictionary")
    
        On Error GoTo catch
    
        If vHistory <> 0 Or vSystem <> 0 Then
            OpenIMEDialog
        End If
        Exit Sub
    catch:
        MsgBox Err.Description
    End Sub
    
    Private Sub OpenIMEDialog()
        Dim path As String
        Dim pid As Long
        path = Environ("SystemRoot") & "\System32\IME\IMEJP\IMJPUEX.EXE"
        pid = Shell(path, vbNormalFocus)
        
        Dim uia As UIAutomationClient.CUIAutomation
        Set uia = New UIAutomationClient.CUIAutomation
        Dim root As UIAutomationClient.IUIAutomationElement
        Set root = uia.GetRootElement
        
        Dim con As UIAutomationClient.IUIAutomationCondition
        Dim conPID As UIAutomationClient.IUIAutomationCondition
        Dim conNAME As UIAutomationClient.IUIAutomationCondition
        Dim conTYPE As UIAutomationClient.IUIAutomationCondition
        Dim dialog As UIAutomationClient.IUIAutomationElement
        Dim tabItem As UIAutomationClient.IUIAutomationElement
        Dim chk As UIAutomationClient.IUIAutomationElement
        Dim ok As UIAutomationClient.IUIAutomationElement
        
        Dim sel As UIAutomationClient.IUIAutomationSelectionItemPattern
        Dim tgl As UIAutomationClient.IUIAutomationTogglePattern
        Dim inv As UIAutomationClient.IUIAutomationInvokePattern
        
        Set conPID = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_ProcessIdPropertyId, pid)
        Set conNAME = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "Microsoft IME の詳細設定")
        Set con = uia.CreateOrCondition(conPID, conNAME)
        
        Dim t As Date
        t = DateTime.Now + TimeValue("0:0:2")
        Do
            Set dialog = root.FindFirst(TreeScope.TreeScope_Children, con)
        Loop While (dialog Is Nothing And t > Now)
        If dialog Is Nothing Then
            MsgBox "設定ダイアログが見つかりませんでした"
            Exit Sub
        End If
        Set conNAME = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "予測入力")
        Set conTYPE = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_ControlTypePropertyId, UIA_ControlTypeIds.UIA_TabItemControlTypeId)
        Set con = uia.CreateAndCondition(conNAME, conTYPE)
        Set tabItem = dialog.FindFirst(TreeScope_Subtree, con)
    
        Set sel = tabItem.GetCurrentPattern(UIAutomationClient.UIA_PatternIds.UIA_SelectionItemPatternId)
        sel.Select
        
        Set conNAME = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "予測入力を使用する(U)")
        Set conTYPE = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_ControlTypePropertyId, UIA_ControlTypeIds.UIA_CheckBoxControlTypeId)
        Set con = uia.CreateAndCondition(conNAME, conTYPE)
        Set chk = dialog.FindFirst(TreeScope_Subtree, con)
        Set tgl = chk.GetCurrentPattern(UIAutomationClient.UIA_PatternIds.UIA_TogglePatternId)
        If tgl.CurrentToggleState = ToggleState_On Then
            tgl.Toggle
        End If
        
    '    Set con = uia.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "OK")
    '    Set ok = dialog.FindFirst(TreeScope_Subtree, con)
    '    Set inv = ok.GetCurrentPattern(UIAutomationClient.UIA_PatternIds.UIA_InvokePatternId)
    '    inv.Invoke
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2020年5月21日 13:03
    2020年5月21日 12:49
  • FYI
    -----------------------------------------------------
    Windows10 IMEの予測入力を無効にする(GPO・レジストリ値)
    https://social.technet.microsoft.com/Forums/ja-JP/d84082fb-f152-4ae0-8f92-6ee72f3b10e3/windows1012288ime12398201042820420837211471243428961211771239512377?forum=win10itprogeneralJP
    -----------------------------------------------------
    2020年5月22日 0:35
  • gekkaさんサンプルを示していただきありがとうございます。やはり,VBAでは難しそうですね。仰るようなダイアログを表示するような方法も考えてみます。ありがとうございました。
    2020年5月22日 4:23
  • FYIさん,レジストリについての情報を頂き,ありがとうございます。レジストリを操作することについては全く考えつきませんでした。一度やってみます。ありがとうございました。
    2020年5月22日 4:27