主题:[讨论]当文本框获得焦点时,如何切换到中文输入法?
maxman
[专家分:1700] 发布于 2006-06-06 18:54:00
如题,语句 sendkeys 似乎办不到,看来必须求救于API了,哪位大哥实现了?请赐教!
另:当文本框获得焦点时,如何自动切换到用户事先指定的输入法?
回复列表 (共12个回复)
沙发
凡尘 [专家分:9680] 发布于 2006-06-06 19:38:00
Private Sub Text1_GotFocus()
SendKeys "^+" 'Ctrl+Shift
End Sub
'可以实现,
板凳
老大徒伤悲 [专家分:29120] 发布于 2006-06-06 19:46:00
巨人老弟的问题很新颖。共同关注。
3 楼
maxman [专家分:1700] 发布于 2006-06-06 23:12:00
谢谢凡尘、老大徒伤悲关注!
没想到 sendkeys 也可以办到。但效果并不理想:
当文本框焦点转出再转入时,ctrl+shift 会把输入法一直向上转,并不能固定一种输入法。而且当软件面向多用户时,有输入法A、输入法B、输入法C……时,各人使用的喜好不同时,麻烦就来了……
请各位再帮帮忙!!
4 楼
maxman [专家分:1700] 发布于 2006-06-06 23:35:00
我找到了一个不是很完美的、却很简单的解决方案:
text1.imemode=1
0 无(缺省设置)。
1 IME 打开
2 IME 关闭
3 IME 被禁止
期待更好的答案:
根据用户的设置,调用任一输入法。
5 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-07 09:29:00
在思路上是不是可以这样设想?
当输入法应但切换的时候,给一个列表框?
但是这样就没有“自动”的含义了。另外,可以在程序最初界面,就确定输入法
6 楼
maxman [专家分:1700] 发布于 2006-06-07 12:08:00
我的思路是这样的:
有用户甲、用户乙、用户丙……
有输入法A、输入法B、输入法C……
每个用户有自己的配置文件,当甲登录时,自动调用甲预先设置的输入法,乙登录时调入乙的输入法……
当然事先得获知所有输入法列表,难就难在怎样提取其中任一输入法。
看来是我对细节太苛刻了。:-(
7 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-07 16:44:00
巨人老弟,你这个想法是可行的!
在用户信息数据表里,除了常规的用户名、密码外,增加一个默认输入法。用户登陆时,选用该输入法。
具体选用的办法,我没有好的方案。说一个臭办法
在登陆窗口做一个combo,但位置放在登陆窗口以外,实际就是不让看到。从用户信息里读出输入法的代码,从列表里选出。
至于选出后,如何使他成为当前输入法,应该是用api,但那方面我是弱项,甚至一窍不通。
8 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-07 16:49:00
打开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 楼
maxman [专家分:1700] 发布于 2006-06-07 20:43:00
在 老大徒伤悲 的帮助下,代码确实可行,我把代码简化了一下。(但不知道省略部分会不会引起系统不适[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 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-07 20:55:00
我也不知道啊,实践出真知,斗争长才干!能不能用一试验便知道了!
恭喜,恭喜,恭喜巨人老弟!
我来回复