用这几个api函数,应该可以满足你的要求:
GetKeyboardLayoutList
ImmGetDescription
ImmIsIME
ActivateKeyboardLayout
GetKeyboardLayout再给你一个例子
Option Explicit
Const KL_NAMELENGTH = 9
Private Declare Function GetKeyboardLayoutList Lib "user32" _
(ByVal nBuff As Long, lpList As Long) As LongPrivate Declare Function ImmGetDescription Lib "imm32.dll" _
Alias "ImmGetDescriptionA" (ByVal HKL As Long, _
ByVal lpsz As String, ByVal uBufLen As Long) As LongPrivate Declare Function ImmIsIME Lib "imm32.dll" (ByVal HKL As Long) As LongPrivate Declare Function ActivateKeyboardLayout Lib "user32" _
(ByVal HKL As Long, ByVal flags As Long) As LongPrivate Declare Function GetKeyboardLayout Lib "user32" _
(ByVal dwLayout As Long) As Long
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Sub Command1_Click()
    If Trim(Combo1.Text) <> "" Then
        ActivateKeyboardLayout GetKBLayout_Handle_ByName(Combo1.Text), 0 '激活某种输入法
    End If
End SubPrivate Sub Form_Load()
Dim StrName As String
Dim hCurKBDLayout As Long
Dim NoOfKBDLayout As Long, i As Long, j As LongDim hKB(24) As Long, BuffLen As LongDim Buff As StringDim RetStr As StringDim RetCount As Long
StrName = String(KL_NAMELENGTH, 0)Buff = String(255, 0)
GetKeyboardLayoutName StrName
hCurKBDLayout = GetKeyboardLayout(0) '取得目前keyboard layoutNoOfKBDLayout = GetKeyboardLayoutList(25, hKB(0))  '取得所有输入法的hkeysFor i = 1 To NoOfKBDLayout  If ImmIsIME(hKB(i - 1)) = 1 Then '中文输入法   BuffLen = 255   RetCount = ImmGetDescription(hKB(i - 1), Buff, BuffLen)   RetStr = Left(Buff, RetCount)
    RetStr = Trim(Buff)
   Combo1.AddItem RetStr  Else   RetStr = "English (American)"  '假设我们的win95非Ime 者只有English   Combo1.AddItem RetStr      '若有其他者,要去取得keyboardLayout  End If               ' Name再去Registry中找其对应的名称  If hKB(i - 1) = hCurKBDLayout Then   Combo1.Text = RetStr  End IfNext'ActivateKeyboardLayout hCurKBDLayout, 0 '恢复原来输入法
'ActivateKeyboardLayout hKB(1), 0 '这种方法可以激活某种输入法
'ActivateKeyboardLayout hKB(2), 0
End SubPrivate Function GetKBLayout_Handle_ByName(Name As String) As Long
    Dim hKB(20) As Long, i As Integer
    Dim BufferLen As Long
    Dim RetStr As String
    Dim NumOfKBLayout As Integer
    Dim Buffer As String
    Dim RetCount As Integer
    Buffer = String(255, 0)
    BufferLen = 255
    NumOfKBLayout = GetKeyboardLayoutList(21, hKB(0))
    For i = 0 To NumOfKBLayout - 1
        RetCount = ImmGetDescription(hKB(i), Buffer, BufferLen)
        If RetCount <> 0 Then
            RetStr = Left(Buffer, RetCount)
            If Left(RetStr, 5) = Left(Trim(Combo1.Text), 5) Then
                GetKBLayout_Handle_ByName = hKB(i)
                Exit For
            End If
        End If
    Next
End Function

解决方案 »

  1.   

    谢谢楼上的,我的情况输入法的可用状态变灰,ctrl+space 就可以恢复可用状态请问我是和那个函数忙上给你分
      

  2.   

    不好意思,我没看清楚你的意思,麻烦你说清楚你的意思,我现在要下班了,明天再回答你把
    ActivateKeyboardLayout hKB(1), 0 '这种方法可以激活某种输入法
      

  3.   

    ActivateKeyboardLayout 和 LoadkeyboardLayout 有什么区别啊?
    他们两个都可以激活某个输入法,但是好像 ActivateKeyboardLayout如果指定 KLF_REORDER 的话,只会改变GetKeylayoutlist中的顺序,而不会改变显示在任务栏上的输入法的顺序,这两个顺序怎么不一样?而用LoadKeyboardlayout就可以一致!还有使用ActivateKeyboardLayout之前要先 LoadKeyboardlayout进来,但是一般情况好像都在了,应该不用Load了!
      

  4.   

    我的情况是这样我的程序中引用了一个表各控件:vsflex7 这个空间很好用就是在连续输入中文的时候,当一个单元格的内容改变了,输入法自动发白色不可用,然后按ctrl+空格 输入法状态变回可用状态每次输入一个单元歌都要改变输入法的状态,我想用api函数让烦白色的输入法变为可用
      

  5.   

    我想使用:ActivateKeyboardLayout hCurKBDLayout, 0 激活原来的输入法
    可是 hCurKBDLayout = GetKeyboardLayout(0) 返回值总是负数,
    hCurKBDLayout = GetKeyboardLayout(1) 返回不定的输入法
    大哥救救我
      

  6.   

    你尝试一下,在原来输入法可用的时候
    hCurKBDLayout = GetKeyboardLayout(0) 获得目前键盘的布局
    当你想激活原来输入发的时候就可以
    ActivateKeyboardLayout  hCurKBDLayout ,0
    激活原来的输入法了,这是我想法,主要我不知道你那出什么问题,所只能简单的说说
      

  7.   

    返回负数是正常的,说明目前的输入法是某个中文输入法,(英文输入法时返回正数)!直接ActivateKeyboardLayout  hCurKBDLayout ,0 就可以了,