我的解决办法是:
给所有输入法指定热键:如五笔为ctrl+C,拼音为ctrl+p
1.取得当前前台活动窗口的句柄:
2.向这个句柄传送热键.
dim Ownd as long
Private Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long
''''''以下为timer事件
dim wnd as long
wnd= getforegroundwindow() '取得前台窗口句柄
if wnd<>me.hwnd then Ownd=wnd
'''''''''''以下为输入法选定,可以放入菜单或按钮事件
setForegroundWindow Ownd
do while getforegroundwindow()<>Ownd
loop
senkeys "^C" '设定五笔输入示
使用GetKeyboardLayoutName可以返回当前输入法,使用GetKeyboardLayoutList可以取得所有的输入法,使用ActivateKeyboardLayout可以设置当前的输入法.
新建一个工程,在From1窗体上,添加两个按钮,一个ComBo Box控件
程序如下:
Private Const KLF_REORDER = &H8
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 GetKeyboardLayoutList Lib "user32" (ByVal nBuff As Long, lpList As Long) As Long
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) 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 LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
Private NoofKBDLayout As Long
Private i As Long
Private hCurKBDLayout As Long
Private Buff As String
Private RetStr As String
Private kIn As String
Private hKB(24) As Long
Private BuffLen As Long
Private RetCount As Long
Private Sub Command1_Click()
If Combo1.ListIndex = -1 Then
MsgBox "未选中输入法"
Exit Sub
End If
kIn = String(8, 0)
ActivateKeyboardLayout hKB(Combo1.ListIndex), 0
GetKeyboardLayoutName kIn
LoadKeyboardLayout kIn, KLF_REORDER '改变输入法的顺序
ActivateKeyboardLayout hCurKBDLayout, 0
End Sub
Private Sub Command2_Click()
If Combo1.ListIndex = -1 Then
MsgBox "未选中输入法"
Exit Sub
End If
kIn = String(8, 0)
ActivateKeyboardLayout hKB(Combo1.ListIndex), 0
Text1.SetFocus
End Sub
Private Sub Form_Load()
Buff = String(255, 0)
hCurKBDLayout = GetKeyboardLayout(0)
NoofKBDLayout = GetKeyboardLayoutList(25, hKB(0))
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)
Else
RetStr = "English (American)" '英文输入法
End If
Combo1.AddItem RetStr
Next i
ActivateKeyboardLayout hCurKBDLayout, 0 '恢复当前的输入法
End Sub
如果你有信箱,我可以将测试程序发给你,我的信箱是guraul3@pub.cz.jsinfo.net
调用imm32.dll系列函数。如:
Public Declare Function ImmGetIMEFileName Lib "imm32.dll" Alias "ImmGetIMEFileNameA" (ByVal hkl As Long, ByVal lpStr As String, ByVal uBufLen As Long) As Long等
具体用法看MSDN有关ime的帮助,因为我急事要走了,来不及写。