如何指定输入法?

BigG 2000-03-23 05:27:00
专家:
如何在程序中弹出指定输入法?
Thank u very much?
...全文
230 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiying_bao 2001-02-16
  • 打赏
  • 举报
回复
我的解决办法是:
给所有输入法指定热键:如五笔为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" '设定五笔输入示

看对你有没有参考价值.
feiying_bao 2001-02-08
  • 打赏
  • 举报
回复
Raul这个方法,我试过,只能切换所在程序的输入法。不能为其它程序切换输入法,将其它程序先获取焦点再使用ActivateKeyboardLayout 也不行。我在做一个安全程序需要隐藏任务栏,又需要用鼠标选输入法,如果有通过句柄为某个窗口设置输入法的API,请告诉我,谢谢。
Raul 2000-03-26
  • 打赏
  • 举报
回复
使用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
MarsXia 2000-03-23
  • 打赏
  • 举报
回复
调用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的帮助,因为我急事要走了,来不及写。
Un1 2000-03-23
  • 打赏
  • 举报
回复
先把指定输入法设置热键,然后用 keybd_event 试一下。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧