zoukankan      html  css  js  c++  java
  • TSF 在Win 8.1下的问题处理(未写完)

    最近发现,之前解决的输入法问题在Windows 8.1下又不工作了:

    • 微软拼音输入法表现为:首字母确实,字符残留。
    • 百度拼音输入法表现为:字符乱序
    • QQ拼音输入法表现为:字符乱序
    • Sogou拼音输入法表现为:输入字符消失

    各个输入表现不一,吐血!研究了好几天,尝试着在程序中加入对TSF的支持,都告失败。无奈,只能联系了微软技术支持,在一周之后,他们给出了解决方案,很简单的方案:

    在Cancel Compostion和切换焦点之间,停顿一下(说白了,就是Sleep),呵呵,这个不看他们的源码,肯定是想不出来的。那么,具体停顿多少时间呢???测试结果如下:微软拼音输入法表现为:首字母确实,字符残留。

    • 微软拼音输入法:需要1秒钟(1000毫秒)
    • 其他输入法:300毫秒
    这微软输入法到底搞的是哪出。。。1秒钟的停顿很难接受,另外,首字母缺失的问题,也没能解决,所以呢。。。继续劳烦微软想办法咯。。。

    先贴一下基于微软目前解决方案的代码,将来有更好的方案再更新~


            private void listView1_KeyDown(object sender, KeyEventArgs e)
            {
                // Avoid ALT+` to change the focus
                if (!e.Alt)
                {
                    CancelComposition();
                    Thread.Sleep(1000);
                    CommandLine.GiveFocus();
                    //if (mEatenVirtualKey != 229)
                    //{
                    //    SendKeys.SendWait(Convert.ToChar(mEatenVirtualKey).ToString().ToLower());
                    //}
                }
            }
    
    
            [DllImport("Imm32.dll")]
            internal static extern IntPtr ImmGetContext(IntPtr hWnd);
            [DllImport("Imm32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            internal static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
            [DllImport("Imm32.dll", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            internal static extern bool ImmNotifyIME(IntPtr hIMC, uint action, uint index, int value);
    
            private void CancelComposition()
            {
                IntPtr hIMC = ImmGetContext(this.Handle);
                try
                {
                    ImmNotifyIME(hIMC, 0x0015, 4, 0);
                }
                finally
                {
                    ImmReleaseContext(this.Handle, hIMC);
                }
            }


    继续做优化:

    1. 在没有启用输入法时,不应该有停顿。
    2. 输入法切换到英文输入模式时,不应该有停顿。
    bool IsImeOn()
    {
        HRESULT hr = S_OK;
        CComPtr<ITfInputProcessorProfiles> pProfiles;
        LANGID langid;
        BSTR bstrImeName = NULL;
    
        hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (LPVOID*)&pProfiles);
        hr = pProfiles->GetCurrentLanguage(&langid);
        CLSID textSrvId, profileId;
        hr = pProfiles->GetDefaultLanguageProfile(langid, GUID_TFCAT_TIP_KEYBOARD, &textSrvId, &profileId);
        LANGID activeLangId;
        CLSID activeProfileId;
        hr = pProfiles->GetActiveLanguageProfile(textSrvId, &activeLangId, &activeProfileId);
        return activeLangId == 0
    }
    
    bool IsImeInEnglishMode()
    {
        HRESULT hr = S_OK;
        ITfThreadMgr* pThreadMgr;
        hr = CoCreateInstance(  CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr);
        ASSERT(S_OK == hr);
        ITfCompartmentMgr* pCompMgr;
        hr = pThreadMgr->QueryInterface(IID_ITfCompartmentMgr, (void**)&pCompMgr);
        ASSERT(S_OK == hr);
        ITfCompartment* pcomp;
        hr = pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION, &pcomp);
        ASSERT(S_OK == hr);
        VARIANT var;
        VariantInit(&var);
        hr = pcomp->GetValue(&var);
        ASSERT(S_OK == hr);
        return var.lVal == 0x904;
    }

    代码可能有点问题,将来再更新

  • 相关阅读:
    Mac下截图快捷键
    在Mac下显示所有文件
    Mac 下格式化U盘
    在Mac OS X系统下 用dd命令将iso镜像写入u盘
    微信公众号全局返回码说明和接口频率限制说明
    Mac Git 学习笔记
    vim编程配置方法
    解决“Xlib.h not found when building graphviz on Mac OS X 10.8”错误
    Java-Session服务器端会话技术
    Java-记住上一次访问时间案例
  • 原文地址:https://www.cnblogs.com/puncha/p/3876851.html
Copyright © 2011-2022 走看看