回 帖 发 新 帖 刷新版面

主题:[讨论]当文本框获得焦点时,如何切换到中文输入法?

如题,语句 sendkeys 似乎办不到,看来必须求救于API了,哪位大哥实现了?请赐教!
另:当文本框获得焦点时,如何自动切换到用户事先指定的输入法?

回复列表 (共12个回复)

沙发

Private Sub Text1_GotFocus()
    SendKeys "^+"  'Ctrl+Shift
End Sub
'可以实现,

板凳

巨人老弟的问题很新颖。共同关注。

3 楼

谢谢凡尘、老大徒伤悲关注!
没想到 sendkeys 也可以办到。但效果并不理想:
当文本框焦点转出再转入时,ctrl+shift 会把输入法一直向上转,并不能固定一种输入法。而且当软件面向多用户时,有输入法A、输入法B、输入法C……时,各人使用的喜好不同时,麻烦就来了……
请各位再帮帮忙!!

4 楼

我找到了一个不是很完美的、却很简单的解决方案:
text1.imemode=1
0 无(缺省设置)。 
1 IME 打开 
2 IME 关闭 
3 IME 被禁止
期待更好的答案:
根据用户的设置,调用任一输入法。

5 楼

在思路上是不是可以这样设想?
当输入法应但切换的时候,给一个列表框?

但是这样就没有“自动”的含义了。另外,可以在程序最初界面,就确定输入法

6 楼

我的思路是这样的:
有用户甲、用户乙、用户丙……
有输入法A、输入法B、输入法C……
每个用户有自己的配置文件,当甲登录时,自动调用甲预先设置的输入法,乙登录时调入乙的输入法……
当然事先得获知所有输入法列表,难就难在怎样提取其中任一输入法。
看来是我对细节太苛刻了。:-(

7 楼

巨人老弟,你这个想法是可行的!

在用户信息数据表里,除了常规的用户名、密码外,增加一个默认输入法。用户登陆时,选用该输入法。

具体选用的办法,我没有好的方案。说一个臭办法
在登陆窗口做一个combo,但位置放在登陆窗口以外,实际就是不让看到。从用户信息里读出输入法的代码,从列表里选出。


至于选出后,如何使他成为当前输入法,应该是用api,但那方面我是弱项,甚至一窍不通。

8 楼

打开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即可。。


这是我找来的,你看看有没有参考价值?

9 楼


在 老大徒伤悲 的帮助下,代码确实可行,我把代码简化了一下。(但不知道省略部分会不会引起系统不适[em6][em1][em6])
'打开VB后选择标准的EXE文档,在Form1上添加一个Combobox和一个command控件,输入以下程序。
'运行后,在combox中选择目标输入法,按下command即可。


Option Explicit

'以下的API函数用于输入法操作
Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
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 hCurKBDLayout&
Private mlnghKB(24) As Long

Private Sub Command1_Click()
    If Combo1.ListIndex = -1 Then '如果用户尚未选择输入法,显示出错信息
        MsgBox "请先选择一个输入法"
        Exit Sub
    End If
    Call ActivateKeyboardLayout(mlnghKB(Combo1.ListIndex), 0)    '根据列表选择,改变激活输入法
End Sub

Private Sub Form_Load()
    Dim lngRetCount&, lngListSum&
    Dim strRe$, strBuff$
    Dim i%
    
    strBuff = String(255, 0)
    hCurKBDLayout = GetKeyboardLayout(0)                '取得目前的输入法
    lngListSum = GetKeyboardLayoutList(25, mlnghKB(0))  '取得所有输入法
    For i = 1 To lngListSum
        If ImmIsIME(mlnghKB(i - 1)) = 1 Then            '中文输入法
            lngRetCount = ImmGetDescription(mlnghKB(i - 1), strBuff, 255)
            strRe = Left(strBuff, lngRetCount)
        Else
            strRe = "EN (英文输入法)"                   '英文输入法
        End If
        Combo1.AddItem strRe
    Next
    Call ActivateKeyboardLayout(hCurKBDLayout, 0)       '恢复原来的输入法
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call ActivateKeyboardLayout(hCurKBDLayout, 0)       '恢复原来的输入法
End Sub

10 楼

我也不知道啊,实践出真知,斗争长才干!能不能用一试验便知道了!
恭喜,恭喜,恭喜巨人老弟!

我来回复

您尚未登录,请登录后再回复。点此登录或注册