如何得到当前输入法的名称 状态等信息

allenhiman 2010-12-22 11:32:15
这方面的资料还真难找 现在把需求先简化为 得到当前输入法的名称 比如“智能ABC” “搜狗”

在vista以前 用IME的函数基本可以实现 但是到vista win7 据说IME的函数不好用了 实际上也的确如此 在xp下好用的代码 win7下就不行 最起码 当输入法是 “智能ABC”时 得不到输入法名称 有些可以

得到过一些资料 但总有问题 请大侠们推荐 教我 谢谢了
...全文
649 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenhiman 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 superarhow 的回复:]
好像做过,回忆不起来了,记忆里面好像是这样的:

#pragma comment(lib, "imm32.lib")
HKL list[256];
int n = GetKeyboardLayoutList(256, list);
wchar_t name[32];
wchar_t klname[260];
for ( int i = 0; i < n; ++i ) {
wsp……
[/Quote]

谢谢 IMM的函数win7下不好使啊
很特别的需求,我们就是想弄个类似IPAD那样的软键盘
superarhow 2011-01-05
  • 打赏
  • 举报
回复
好像做过,回忆不起来了,记忆里面好像是这样的:

#pragma comment(lib, "imm32.lib")
HKL list[256];
int n = GetKeyboardLayoutList(256, list);
wchar_t name[32];
wchar_t klname[260];
for ( int i = 0; i < n; ++i ) {
wsprintf(name, L"%08X", list[i]);
HKL hkey = LoadKeyboardLayout(name, 0);
ActivateKeyboardLayout(hkey, 0);
// ::GetKeyboardLayoutName(klname);
ImmGetDescription( hkey, klname, 260 );

// ::UnloadKeyboardLayout(hkey);
}
allenhiman 2011-01-05
  • 打赏
  • 举报
回复
山寨IPAD,要模拟操作系统的感觉
雪岢奇 2010-12-24
  • 打赏
  • 举报
回复
很少见需要获取输入法的,楼主在做什么项目需要获取输入法?
allenhiman 2010-12-23
  • 打赏
  • 举报
回复
这方面的资料看来挺难搞的 楼上兄弟的代码在xp下是么问题的 但是vista win7等就不太好用啊 正如题目所说的 有些输入法就认不出来了
allenhiman 2010-12-23
  • 打赏
  • 举报
回复
好的 我看看
jacky_qiu 2010-12-23
  • 打赏
  • 举报
回复
这个可以帮助你!
http://blog.csdn.net/jacky_qiu/archive/2010/11/18/6016841.aspx
allenhiman 2010-12-23
  • 打赏
  • 举报
回复
谁帮帮忙啊 我实在没辙啊
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复
应该是shell级的函数吧
allenhiman 2010-12-22
  • 打赏
  • 举报
回复
代码看起来挺诡异的 其实就是得到ITF的相关接口 然后枚举输入法
allenhiman 2010-12-22
  • 打赏
  • 举报
回复
我贴一下代码 这个被转过很多次了 原出处应该是一个微软开发组回答的某人的提问。
这是一个枚举系统都有哪些输入法的代码 在我的机器上 xp sp3只能枚举到3个
"微软拼音3.0" "微软拼音” “语音识别”

实际上有好多呢 最起码“搜狗”输入法就没枚举出来

int _tmain(int argc, _TCHAR* argv[])

{

CoInitialize(0);

HRESULT hr = S_OK;



ITfInputProcessorProfiles *pProfiles;



hr = CoCreateInstance( CLSID_TF_InputProcessorProfiles,

NULL,

CLSCTX_INPROC_SERVER,

IID_ITfInputProcessorProfiles,

(LPVOID*)&pProfiles);



if(SUCCEEDED(hr))

{

IEnumTfLanguageProfiles* pEnumProf = 0;

hr = pProfiles->EnumLanguageProfiles(0x804, &pEnumProf);

if (SUCCEEDED(hr) && pEnumProf)

{

TF_LANGUAGEPROFILE proArr[2];

ULONG feOut = 0;

while (S_OK == pEnumProf->Next(1, proArr, &feOut))

{

BSTR bstrDest;

hr = pProfiles->GetLanguageProfileDescription(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bstrDest);

OutputDebugString(bstrDest);

MessageBox( NULL, bstrDest, L"test", NULL );
printf("\n");



BOOL bEnable = false;

hr = pProfiles->IsEnabledLanguageProfile(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bEnable);

if (SUCCEEDED(hr))

{

printf("Enabled %d\n", bEnable);

}

SysFreeString(bstrDest);

}

}



pProfiles->Release();

}



CoUninitialize();

return 0;

}
allenhiman 2010-12-22
  • 打赏
  • 举报
回复
谢谢 注册表这个 我也查看过 实际上我们需要接受好几个消息 比如全角半角切换 中英文切换等 现在我就先咨询一下 如何得到当前输入法的名字 剩下的自己钻研一下
J_act 2010-12-22
  • 打赏
  • 举报
回复
枚举当前系统中所有输入法可以通过枚举
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
项下的值得到。
至于如何取得当前输入法我就不知道了,
希望能对lz有所帮助。
allenhiman 2010-12-22
  • 打赏
  • 举报
回复
感谢楼上的信息 我分不多了 给不出诱人的分数 谁能再提供些信息 有代码或例子就太好了

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧