辣椒龙 发表于 2010-7-16 22:14:25

如何获取应用程序当前的输入法状态(已解决)

本帖最后由 辣椒龙 于 2010-8-17 19:18 编辑

比如说我打开的扫雷软件,如何确定它目前工作在什么输入法状态下(简体中文-美式键盘、智能ABC等),以及更进一步的切换输入法状态到我指定的输入法。
1.曾有一个思路是读取系统设置的默认输入法,也就是一打开某软件,它会工作在什么输入法下。不过这样的方法对已经打开的软件(可能已经被用户改变输入法状态)容易失效。
2.关于切换输入法。其实当前的问题是想切换到英文输入法状态下(当然,前提是系统中存在这个输入法),通过发送CTRL-SPACE键来切换担心热键被用户改过。如果读取注册表判断热键后再发送又感觉好麻烦,不知道有没有比较简洁的方法或思路可以提供下。


在lynfr8的帮助下,问题完美解决了。不知为什么不能回复,只能在这里感谢下了!下面是一个例子……Opt("WinTitleMatchMode", 4)
Run("notepad.exe")
Sleep(500)
$hWnd = WinGetHandle("classname=Notepad")

;~ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
$KeyStr=_GetKeyboardLayout($hWnd)
$KeyName=RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\" & $KeyStr, "Layout Text")
MsgBox (0, $KeyStr, $KeyName);显示当前输入法
LoadKeyboardLayout("E0200804", $hWnd);设为搜狗拼音输入法 你应该先确认输入法是否已安装

Func _GetKeyboardLayout($hWnd)
    Local $ret = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0)
          $ret = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $ret)
          Return Hex($ret, 8)
EndFunc          
Func LoadKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 1 + 0)
    DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret)       
EndFunc   ;==>LoadKeyboardLayout

lynfr8 发表于 2010-7-17 01:31:21

1.如何确定它目前工作在什么输入法状态下(简体中文-美式键盘、智能ABC等):
http://www.autoitx.com/forum.php?mod=redirect&goto=findpost&ptid=1754&pid=11853&fromuid=1003
2.切换输入法:
http://www.autoitx.com/thread-9552-1-1.html
自己领悟下里面的精髓,你的问题自然迎刃而解
PS:以上链接皆为搜索本论坛所得!

lynfr8 发表于 2010-7-17 01:41:28


在系统中已安装的输入法信息在注册表 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=tt
ActivateKeyboardLayout:http://baike.baidu.com/view/1080058.htm
LoadKeyboardLayout :http://baike.baidu.com/view/1080078.htm

除了这些,微软还提供了对输入法更加详细的操作 API
如切换或获取 半/全 角,切换大小写,显示/隐藏 输入法状态栏 等

有兴趣可以查看 MSDN:
http://msdn.microsoft.com/en-us/library/aa914560.aspx

lxz 发表于 2010-7-17 06:01:16

原来在注册表里有显示...

nmgwddj 发表于 2010-7-17 11:57:00

好贴 收藏{:face (382):}
输入法的问题以前碰到过。。不过lynfr8的这些资料又够我看一阵子的了

dessio 发表于 2011-6-8 17:24:06

需要好好学习了呀。:)强大。

cfwyy 发表于 2017-9-16 11:10:54

好贴收藏!

resethdd 发表于 2019-8-26 18:25:53

最近被输入法干扰所困扰,学习学习。

redapple2008 发表于 2019-8-30 08:40:56

输入法干扰所困扰我已经无语,以前以为是程序不执行是代码问题,后来才发现是输入法。
页: [1]
查看完整版本: 如何获取应用程序当前的输入法状态(已解决)