none
关于win7下切换输入法 RRS feed

  • 问题

  • std::wstring szImeName = L""; 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); if (!(SUCCEEDED(hr))) return false; hr = pProfiles->GetCurrentLanguage(&langid); if (!(SUCCEEDED(hr))) return false; CLSID textSrvId, profileId; hr = pProfiles->GetDefaultLanguageProfile(langid, GUID_TFCAT_TIP_KEYBOARD, &textSrvId, &profileId); if (!(SUCCEEDED(hr))) return false; hr = pProfiles->GetActiveLanguageProfile(textSrvId, &langid, &profileId); if (!(SUCCEEDED(hr))) { DWORD dw = GetLastError(); //return false; } hr = pProfiles->GetLanguageProfileDescription(textSrvId, langid, profileId, &bstrImeName); if (!(SUCCEEDED(hr))) return false; szImeName = bstrImeName; SysFreeString(bstrImeName);

    在win10下 可以获取当前使用的tsf输入法的名字 ,但是在win7下就无法使用,win7下 pProfiles->GetActiveLanguageProfile返回的是E_UNEXPECTED,

    tsf框架这些接口不是最低支持win2000吗?为什么在win7下面无法使用?

    还有,在win7下 切换ime输入法 我可以通过下面这种方式切换输入法,

    但是tsf输入法怎么切换呢?谢谢各位专家?比较着急

    HKL temphkl = LoadKeyboardLayout(InputId.c_str(), KLF_SETFORPROCESS);
    
    if (hWnd != nullptr)
    {
    		PostMessage(hWnd, WM_IME_NOTIFY, IMN_CLOSECANDIDATE, 0);
    		PostMessage(hWnd, WM_INPUTLANGCHANGE, 1, (LPARAM)temphkl);
    		PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, 1, (LPARAM)temphkl);
     }

    2016年12月30日 7:57

全部回复

  • Hi 岁月流年,

    感谢在MSDN论坛发帖。

    >>在win10下 可以获取当前使用的tsf输入法的名字 ,但是在win7下就无法使用,win7下  pProfiles->GetActiveLanguageProfile返回的是E_UNEXPECTED,

    tsf框架这些接口不是最低支持win2000吗?为什么在win7下面无法使用?

    E_UNEXPECTED的意思是No thread manager was created for the calling thread. 这不是一个正常的返回值。按照这篇文档上的说明,GetActiveLanguageProfile 的返回值如下。

    请将具体的错误码上传,方便我们查找根本原因。

    >>还有,在win7下 切换ime输入法 我可以通过下面这种方式切换输入法,

    但是tsf输入法怎么切换呢?谢谢各位专家?比较着急

    对于这种情况,你可以使用ITfInputProcessorProfiles::ChangeCurrentLanguage方法来实现。

    希望可以帮助到你。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月30日 9:11
  • GetLastError() 获取的错误码是0

    ChangeCurrentLanguage需要的是一个LANGID ,

    我发现中文情况下 LANGID 永远都是2052 

    我想把搜狗输入法切换成 qq输入法,他们的langid都是2052,所以导致没法切换。

    ChangeCurrentLanguage是需要有什么上下文几个api一起用才会起作用吗?

    2016年12月30日 10:06
  • Hi 岁月流年,

    >>GetLastError() 获取的错误码是0

    ChangeCurrentLanguage需要的是一个LANGID ,

    我发现中文情况下 LANGID 永远都是2052 

    我想把搜狗输入法切换成 qq输入法,他们的langid都是2052,所以导致没法切换。

    如果你是想在搜狗和qq输入法之间切换,这个函数无法实现。你可以尝试使用SendInput函数,来模拟Ctrl+Shift按键,进而实现输入法的切换。

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年1月3日 6:37
  • 模拟ctrl+shhift 

    在win10上可以实现,因为win10 输入法是全局的,比如我在记事本里从搜狗切换到百度输入法,那么 打开ie也变成百度输入法了

    但是在win7上有问题,win7判断当前窗口ime输入法是什么,用到HKL hkl = GetKeyboardLayout(threadid);如果焦点在浏览器里面的网页的时候,这个api获取不到当前的输入法是什么,这样我就没法准确切换到指定的输入法了。而且在win7上,当前输入法是TSF输入法的话,GetKeyboardLayout也就失效了。

    2017年1月3日 7:02
  • >>模拟ctrl+shhift 

    在win10上可以实现,因为win10 输入法是全局的,比如我在记事本里从搜狗切换到百度输入法,那么 打开ie也变成百度输入法了

    但是在win7上有问题,win7判断当前窗口ime输入法是什么,用到HKL hkl = GetKeyboardLayout(threadid);如果焦点在浏览器里面的网页的时候,这个api获取不到当前的输入法是什么,这样我就没法准确切换到指定的输入法了。而且在win7上,当前输入法是TSF输入法的话,GetKeyboardLayout也就失效了。

    你尝试过使用LoadKeyboardLayout加载进入,然后使用ActivateKeyboardLayout函数激活吗?

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年1月3日 7:18
  • 尝试过,但是还是面临 在win7上如果出现TSF输入法,那么这套api就失效了,在win7上qq输入法是TSF输入法,如果想切换成qq输入法,用LoadkeyboardLayout不管用了就,而且也没办法获取当前的输入法是qq输入法,因为GetKeyboardLayout针对tsf输入法不起作用,我做开始贴的那段代码,GetActiveLanguageProfile在win7 永远是E_UNEXPECTED
    2017年1月3日 7:25