1请问一下在vista或win7下,用程序如何枚举当前windows用户的所有输入法.
2窗口和输入法有啥关系?比如’远程桌面连接‘成功后,就不能切换输入法,也不能显示语言栏。
但是其他的windows窗口就能正常切换输入法,并且显示语言栏.

解决方案 »

  1.   

    1 以前XP或者windows2003等系统,当前用户的输入法在注册表HKEY_CURRENT_USER\Keyboard Layout\Preload这个键下能找到。换成了vista或者win7,这个注册表里只有一部分了,比如微软拼音就没有了
    2 本地的语言栏都不显示了,没法手选。只能看见远程连接服务器上的语言栏了. 
      

  2.   

    因为远程服务器的输入法和本地的输入法不一样,我想实现使用本地的输入法进行输入。
    我找到了’远程桌面连接‘的输入窗口的句柄,给这个窗口句柄重新关联上默认的‘输入法上下文’(ImmAssociateContextEx)就能使用本地的输入法了,但是本地的输入法切换有问题,并且不显示语言栏。搞不懂为什么?
      

  3.   

    蒋老大,考虑的长远呀,我的代码现在还不支持纯粹的64位系统,现在64位windows系统一般都提供32位的兼容环境。
    我的基本思路是:截获’远程桌面连接‘本地输入法的消息比如:WM_CHAR,WM_IME_XXX,然后发送到远程服务器当前激活的那个窗口里。现在基本上可以实现这个功能,但是本地输入法切换不正常。
    另外关于问题一,查看了新的在线MSDN,使用ITfInputProcessorProfileMgr貌似可以枚举所有的输入法(包括文本服务和键盘布局)。
      

  4.   

    系统存放输入法信息的地方在注册表中HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard  Layouts\\  这里面有很多键,每个都以一个8个字长的字符串命名,点击其中任何一个,可以看到其中有两个主键值,都为REG_SZ型,一个是Layout File,记录该输入法所用的DLL,一个是Layout Text,记录该输入法的中文名称.事实上,那8个字长的字符串就是这个输入法的ID.得到当前使用的输入法.
    BOOL GetKeyboardLayoutName(
      LPTSTR pwszKLID   // input locale identifier name
    );
     
     这个函数可以轻松地得到系统当前正在使用的输入法的ID,那问题就很明显了,我们要得到的就是这个ID所对应的输入法的名称.这样,上面所谈的注册表就派上用场了,因为HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard  Layouts\\  下所有有的文件夹都是以输入法ID的名称命名的,我们只要把得到的输入法的ID定位到该文件夹,就可以从其中的一个键: Layout Text得到输入法的中文名称
      

  5.   

    楼上说的方法是得到当前正在使用的输入法,我想得到的是当前windows用户的所有输入法。
      

  6.   

    搜狗,QQ,Google.好多阿.
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
      

  7.   

    有两个地方存放着输入法的信息,要是调用 ImmInstallIME 来安装的输入法信息都在这里。Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Keyboard Layout][HKEY_CURRENT_USER\Keyboard Layout\Preload]
    "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"
      

  8.   

    别人明明问的WIN7或者VISTA下 贴一堆XP下的搞法
      

  9.   

    应该有取得
    HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\
    下所有子项的方法吧
      

  10.   

    RegOpenKey打开
    HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\

    RegEnumKey 
    应该可以吧,
    没试过,楼主可以试试看
      

  11.   


    能否将代码共享下,[email protected]。非常感谢。
      

  12.   

    使用下面这个类;例子下载:http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC%5EM%5EM/%E8%BE%93%E5%85%A5%E6%B3%95.zip头文件:/***************文件开始(InputLanguage.h)****************/
    //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;
    }
      

  13.   

    楼上没脸还贴XP的,人家问的是VISTA和WIN7的.