/*
用AHK代码实现输入法的切换,和获取当前的输入法,这只是一个示例,你可以发挥把它做成更有用的程序,例如对指定的窗口使用指定的输入法,可以为每个输入法设置一个单独的快捷键等。不过有个 BUG,当输入法切换到 微软输入法后,再获取当前输入法状态,会出错。不知道是不是我输入法的问题!
在系统中已安装的输入法信息在注册表 HKEY_USERS\.DEFAULT\Keyboard Layout\Preload 。里面只有输入法的键盘布局名称,如 E0040840 左E004说明该输入法的标识(智能ABC)右0804 说明该输入法为 中文输入法。其输入法的具体名称可到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Keyboard Layouts\ 输入法的键盘布局名称 。Layout Text键值为该输入法的名称。
注意:可能显示的已安装的输入法比任务栏的输入法列表少,你可以到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control\Keyboard Layouts\ 找到所有在系统中已注册的输入法。
调用指定输入法:首先需要获得输入法的键盘布局,再调用API函数 LoadKeyboardLayout 把指定的输入法激活,该函数返回指定输入法的键盘布局句柄,最后还需要向当前的活动窗口发送切换输入法的消息,DllCall("SendMessage", UInt, 活动窗口的句柄, UInt, 80, UInt, 1, UInt,输入法键盘布局句柄) 。这样就完成了调用指定的输入法。
切换输入法:与调用相类似,调用API函数 ActivateKeyboardLayout 完成 。当然最后也需要发送切换输入法的消息。函数 ActivateKeyboardLayout ( HKL hkl,UINT Flags);其中当参数 hkl 的值为 1 表示切换下一个输入法,0 为上一个输入法。
获取当前的输入法:直接调用API函数 GetKeyboardLayout,该函数直接返回当前键盘布局的名称,如需要确切的输入法名字,到注册表中查找即可。
相关API函数说明:
GetKeyboardLayout :
http://baike.baidu.com/view/1080067.html?wtp=ttActivateKeyboardLayout:
http://baike.baidu.com/view/1080058.htmLoadKeyboardLayout :
http://baike.baidu.com/view/1080078.htm除了这些,微软还提供了对输入法更加详细的操作 API,如切换或获取 半/全 角,切换大小写,显示/隐藏 输入法状态栏 等。
有兴趣可以查看 MSDN:
http://msdn.microsoft.com/en-us/library/aa914560.aspx代码如下:
*/
#NoEnv
#SingleInstance, Force
Gui, Add, ListView, xm w260 h320 vListIME, 键盘布局|名称
Gui, Add, Button, xm y+10 w80 gPreIME, 上一输入法
Gui, Add, Button, x+10 yp w80 gStateIME, 当前输入法
Gui, Add, Button, x+10 yp w80 gNextIME, 下一输入法
Gui, Show,,输入法切换
ReadIME:
hwnd := WinActive("A")
IME_Code_ := IME_GetX()
while, (IME_Code != IME_Code_)
{
IME_Next(hwnd)
IME_Code := IME_GetX()
RegRead, IME_Name, HKLM, SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%IME_Code%, Layout Text
if !IME_Name
{
IME_CodeB := "0000" SubStr(IME_Code,-3)
RegRead, IME_Name, HKLM, SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%IME_CodeB%, Layout Text
}
LV_Insert(A_Index,"", IME_Code, IME_Name)
}
LV_ModifyCol(1, "Sort")
Return
GuiClose:
ExitApp
StateIME:
MsgBox, % "当前键盘布局为 " IME_GetX()
return
NextIME:
IME_Next(WinActive("A"))
Return
PreIME:
IME_Pre(WinActive("A"))
Return
IME_GetX()
{
Return Format("{1:08X}", DllCall("GetKeyboardLayout","int",0,UInt) )
}
IME_Get()
{
Return DllCall("GetKeyboardLayout","int",0,UInt)
}
IME_Set(hwnd,Layout)
{
DllCall("SendMessage", UInt, hwnd, UInt, 80, UInt, 1, UInt, DllCall("LoadKeyboardLayout", Str, Layout, UInt, 1))
}
IME_Next(hwnd)
{
DllCall("SendMessage", UInt, hwnd, UInt, 80, UInt, 1, UInt, DllCall("ActivateKeyboardLayout", UInt, 1, UInt, 256))
}
IME_Pre(hwnd)
{
DllCall("SendMessage", UInt, hwnd, UInt, 80, UInt, 1, UInt, DllCall("ActivateKeyboardLayout", UInt, 0, UInt, 256))
}