用VB读取和控制Windows的中文输入法
 
 
    在Windows中我们可以用“Ctrl+Shift”键来调入或切换中文输入法,但是这样做每次都是使位于输入法列表顶端的那个输入法首先被调用。通常我们都要连续按好几次“Ctrl+Shift”才能将习惯的输入法调出。我编制了一段小程序,通过它可以把任意一个输入法放在输入法列表的顶端。
  它的原理是:使用LoadKeyboardLayout函数可以改变输入法的顺序,只要在第一个参数中传递目标输入法的KeyboardlayoutName,第二个参数用KLF_REORDER就可以了。 
  例如,aa = LoadKeyboardLayout(″00000409″, KLF_REORDER) 使英文变成第一。那怎样获得KeyboardlayoutName呢?因为使用GetKeyboardLayoutname可以返回当前输入法的KeyboardlayoutName,所以我们可以先用GetKeyboardLayoutList 函数来取得所有输入法,再用activateKeyboardlayout()函数设置当前输入法,最后就可以得到它的KeyboardlayoutName了。具体步骤如下: 
  打开VB后选择标准的EXE文档,在Form1上添加一个Combobox和一个command控件,输入以下程序。 
  ′以下的API函数用于输入法操作 
  Private Declare Function GetKeyboardLayoutList Lib ″user32″ _ 
  (ByVal nBuff As Long, lpList As Long) As Long 
  Private Declare Function ImmGetDescription Lib ″imm32.dll″ _ 
  Alias ″ImmGetDescriptionA″ (ByVal hkl As Long, _ 
  ByVal lpsz As String, ByVal uBufLen As Long) As Long 
  Private Declare Function ImmIsIME Lib ″imm32.dll″ (ByVal hkl As Long) As Long 
  Private Declare Function ActivateKeyboardLayout Lib ″user32″ _ 
  (ByVal hkl As Long, ByVal flags As Long) As Long 
  Private 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 Declare Function LoadKeyboardLayout Lib ″user32″ Alias ″LoadKeyboardLayoutA″ _ 
  (ByVal pwszKLID As String, ByVal flags As Long) As Long 
  Const KLF_REORDER = &H8 
  Private NoOfKBDLayout As Long, i As Long, j As Long 
  Private hKB(24) As Long, BuffLen As Long 
  Private Buff As String 
  Private RetStr As String 
  Private RetCount As Long 
  Private kln As String 
  Private Sub Command1_Click() 
  If Combo1.ListIndex = -1 Then′如果用户尚未选择输入法,显示出错信息 
  MsgBox ″请先选择一个输入法″ 
  Exit Sub 
  End If 
  ′改变输入法顺序 
  kln = String(8, 0) 
  ActivateKeyboardLayout hKB(Combo1.ListIndex), 0 
  res = GetKeyboardLayoutName(kln) 
  res = LoadKeyboardLayout(kln, KLF_REORDER) 
  ActivateKeyboardLayout hCurKBDLayout, 0 
  End Sub 
  Private Sub Form_Load() 
  Buff = String(255, 0) 
  hCurKBDLayout = GetKeyboardLayout(0) ′取得目前的输入法 
  NoOfKBDLayout = GetKeyboardLayoutList(25, hKB(0)) ′取得所有输入法 
  ′ReDim layoutlist(NoOfKBDLayout) As String 
  For i = 1 To NoOfKBDLayout 
  If ImmIsIME(hKB(i - 1)) = 1 Then ′中文输入法 
  BuffLen = 255 
  RetCount = ImmGetDescription(hKB(i - 1), Buff, BuffLen) 
  RetStr = Left(Buff, RetCount) 
  Combo1.AddItem RetStr 
  Else 
  RetStr = ″English (American)″ ′英文输入法 
  Combo1.AddItem RetStr 
  End If 
  Next 
  ActivateKeyboardLayout hCurKBDLayout, 0 ′恢复原来的输入法 
  End Sub 
  运行后,在combobox中选择目标输入法,按下command即可。。
 
   
 
  
 

解决方案 »

  1.   


        如何自动更动成中文输入
     
     如果使用的VB5.0则,查看有没有一个属性是IMEMode,如果有就设定为1 代表开启,那
    便可以每次进入这个Control项时就切换成中文输入。如果没有,那只好自己做。'以下在.Bas
    Public Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
    Public Declare Function ImmIsIME Lib "imm32.dll" (ByVal hkl As Long) As Long
    Public Declare Function ImmSimulateHotKey Lib "imm32.dll" (ByVal hwnd As Long, ByVal dw As Long) As Long
    Const IME_THOTKEY_IME_NONIME_TOGGLE = &H70PuBlic Sub Chg2Chinese(ByVal hwnd As Long) '传入Control项或Form 的hwnd
    Dim hkb As Long
    hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout
    If ImmIsIME(hkb) = 0 Then  '代表不是中文输入
      ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space
    End If
    End SubPuBlic Sub Chg2English(ByVal hwnd As Long) '传入Control项或Form 的hwnd
    Dim hkb As Long
    hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout
    If ImmIsIME(hkb) = 1 Then  '代表是中文输入
      ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space
    End If
    End Sub'以下在Form
    Private Sub Form_Load()
    Call Chg2Chinese(Me.hwnd)
    End Sub 
     
      

  2.   

    lihonggen0(李洪根,用VB,标准答案来了)
        首先谢谢您的答案,还有一些不明白的问题要问您:一般的输入法是如何取字码的,字码与键盘的关系是如何确定的?