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;
    }

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

  • 相关阅读:
    struct
    python Hbase Thrift pycharm 及引入包
    python 性能鸡汤
    hbase 0.96 单机伪分布式配置文件及遇到的问题 find命令
    ubuntu下配置protobuf
    hadoop 2.2.0 eclipse 插件编译 及相关eclipse配置图解
    hadoop2.2.0 单机伪分布式(含64位hadoop编译) 及 eclipse hadoop开发环境搭建
    install ubuntu
    ubuntu wubi安装注意事项
    HBase eclipse开发环境搭建
  • 原文地址:https://www.cnblogs.com/puncha/p/3876851.html
Copyright © 2011-2022 走看看