1请问一下在vista或win7下,用程序如何枚举当前windows用户的所有输入法.
2窗口和输入法有啥关系?比如’远程桌面连接‘成功后,就不能切换输入法,也不能显示语言栏。
但是其他的windows窗口就能正常切换输入法,并且显示语言栏.
2窗口和输入法有啥关系?比如’远程桌面连接‘成功后,就不能切换输入法,也不能显示语言栏。
但是其他的windows窗口就能正常切换输入法,并且显示语言栏.
解决方案 »
- MFC中应用mschart控件实现实时曲线的显示问题
- ShowWindow和OnPaint
- 为什么用VC++6.0编译的OpenGL程序占用内存都至少有20兆?
- 在VC6.0改造一个DIB类的具体步骤
- 请推荐驱动程序培训学校
- SDK书籍和MSDN书籍都是些什么书籍呀!
- 如何使用文件的快捷方式(包括生成和读取它的真实路径)
- 请大家帮帮我
- 微软MCSD认证对编程技术的提高有多大帮助,难度如何?“钱”途如何?
- 在程序中,如何发出类似qq的嘟嘟嘟的声音,请想细解释,谢谢
- 如何获取这个网址的session id http://lvt.zoosnet.net/LR/chat.aspx?from=LVT62306672
- QQ和MSN是否有官方发布的API可以二次开发?
2 本地的语言栏都不显示了,没法手选。只能看见远程连接服务器上的语言栏了.
我找到了’远程桌面连接‘的输入窗口的句柄,给这个窗口句柄重新关联上默认的‘输入法上下文’(ImmAssociateContextEx)就能使用本地的输入法了,但是本地的输入法切换有问题,并且不显示语言栏。搞不懂为什么?
我的基本思路是:截获’远程桌面连接‘本地输入法的消息比如:WM_CHAR,WM_IME_XXX,然后发送到远程服务器当前激活的那个窗口里。现在基本上可以实现这个功能,但是本地输入法切换不正常。
另外关于问题一,查看了新的在线MSDN,使用ITfInputProcessorProfileMgr貌似可以枚举所有的输入法(包括文本服务和键盘布局)。
BOOL GetKeyboardLayoutName(
LPTSTR pwszKLID // input locale identifier name
);
这个函数可以轻松地得到系统当前正在使用的输入法的ID,那问题就很明显了,我们要得到的就是这个ID所对应的输入法的名称.这样,上面所谈的注册表就派上用场了,因为HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\ 下所有有的文件夹都是以输入法ID的名称命名的,我们只要把得到的输入法的ID定位到该文件夹,就可以从其中的一个键: Layout Text得到输入法的中文名称
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
"1"="e0200804"
"2"="00000804"
"3"="e0220804"
"4"="e0240804"
"5"="e0250804"
"6"="e0260804"
"7"="e0280804"
"8"="E0290804"
"9"="E02A0804"[HKEY_CURRENT_USER\Keyboard Layout\Substitutes][HKEY_CURRENT_USER\Keyboard Layout\Toggle]
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts][HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000401]
"Layout File"="KBDA1.DLL"
"Layout Text"="Arabic (101)"
"Layout Display Name"="@%SystemRoot%\\system32\\input.dll,-5084"[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000402]
"Layout Text"="Bulgarian (Typewriter)"
"Layout Display Name"="@%SystemRoot%\\system32\\input.dll,-5053"
"Layout File"="KBDBU.DLL"
HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\
下所有子项的方法吧
HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\
再
RegEnumKey
应该可以吧,
没试过,楼主可以试试看
能否将代码共享下,[email protected]。非常感谢。
//InputLanguage.h
#ifndef INPUTLANGUAGE_H
#define INPUTLANGUAGE_H
#ifndef UNICODE
#define U_strcpy strcpy
#define U_strcmp strcmp
#else
#define U_strcpy wcscpy
#define U_strcmp wcscmp
#endif
#include <windows.h>
#include <tchar.h>typedef struct tag_ILNode
{
TCHAR ilID[15]; //输入法代号
TCHAR szName[100];//输入法的说明文字
tag_ILNode* pNext;
}ILNODE,*PILNODE;
class CInputLanguage
{
public:
CInputLanguage( );
~CInputLanguage( );
public:
//加载系统中所有已安装输入法
int LoadIL( void );
//根据输入法名称查找输入法
PILNODE FindILByName( TCHAR* pName );
//根据输入法代码查找输入法
PILNODE FindILByCode( TCHAR* pCode );
//获取当前输入当代码
int GetCurrentILCode( TCHAR* pCode );
//设置当前输入法
int SelectIL( PILNODE pIL );
//清空已加载输入法信息
int Clear( void );
private:
public:
PILNODE m_pILHead;
};
#endif
/***************文件结束****************/
源文件:/***************文件开始(InputLanguage.cpp)****************/
#include "StdAfx.h"
#include "InputLanguage.h"
#pragma comment(lib,"advapi32.lib") #include <string>
using namespace std;CInputLanguage::CInputLanguage( )
{
m_pILHead = NULL;
}CInputLanguage::~CInputLanguage( )
{
Clear( );
}int CInputLanguage::LoadIL( void )
{
HKEY hKey,hKey1;
DWORD cp=16;
TCHAR lp[15];
TCHAR szKeyName[] = _T("Keyboard Layout\\Preload");
TCHAR szKeyName1[] = _T("System\\CurrentControlSet\\Control\\Keyboard Layouts\\");
int i=1;
TCHAR szID[11];
_itot(i,szID,10);
DWORD lpT=REG_SZ;
if(::RegOpenKey(HKEY_CURRENT_USER,szKeyName,&hKey)==ERROR_SUCCESS )
{
while( ::RegQueryValueEx(hKey,szID,NULL,&lpT,(LPBYTE)lp,&cp) == ERROR_SUCCESS )
{
string szTempName=szKeyName1;
szTempName+=lp;
if(RegOpenKey(HKEY_LOCAL_MACHINE,szTempName.c_str(),&hKey1)==ERROR_SUCCESS )
{
TCHAR lpD[100];
DWORD lpS=100; //DataSize
if(RegQueryValueEx(hKey1,_T("Layout Text"),NULL,&lpT,(LPBYTE)lpD,&lpS)==ERROR_SUCCESS)
{
PILNODE p1,p2;
p1 = m_pILHead;
p2 = new(ILNODE);
U_strcpy(p2->ilID,lp);
U_strcpy(p2->szName,lpD);
p2->pNext = NULL;
if( p1 )
{
while( p1->pNext )
{
p1 = p1->pNext;
}
p1->pNext = p2;
}else
{
m_pILHead = p2;
}
}
}
::RegCloseKey(hKey1);
i++;
_itot(i,szID,10);
}
}
::RegCloseKey(hKey);
if ( m_pILHead == NULL )
{
return -1;
}else
{
return 0;
}
}int CInputLanguage::SelectIL( PILNODE pIL )
{
if( !pIL )
{
return -1;
}
HKL hkl;
hkl=LoadKeyboardLayout(pIL->ilID,KLF_ACTIVATE);//装载输入法
if( hkl==NULL )
{
return -2;
}else
{
ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
}
return 0;
}int CInputLanguage::Clear( void )
{
PILNODE p1,p2;
p1 = m_pILHead;
while( p1 )
{
p2 = p1;
p1 = p1->pNext;
delete(p2);
}
m_pILHead = NULL;
return 0;
}PILNODE CInputLanguage::FindILByName( TCHAR* pName )
{
PILNODE p1;
p1 = m_pILHead;
while( p1 )
{
if ( U_strcmp( pName, p1->szName ) == 0 )
{
return p1;
}
p1 = p1->pNext;
}
return NULL;
}PILNODE CInputLanguage::FindILByCode( TCHAR* pCode )
{
PILNODE p1;
p1 = m_pILHead;
while( p1 )
{
if ( U_strcmp( pCode, p1->ilID ) == 0 )
{
return p1;
}
p1 = p1->pNext;
}
return NULL;
}int CInputLanguage::GetCurrentILCode( TCHAR* pCode )
{
int nRet;
nRet = GetKeyboardLayoutName( pCode );
if ( nRet != 0 )
{
return 0;
}else
{
return -1;
}
}
/***************文件结束****************/调用如下:
CInputLanguage input; input.LoadIL();
PILNODE p=input.m_pILHead;
while(p)
{
trace2( p->ilID,p->szName );
p=p->pNext;
}