找回密码
 加入
搜索
查看: 15257|回复: 8

[系统综合] 如何获取应用程序当前的输入法状态(已解决)

  [复制链接]
发表于 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[0])
          Return Hex($ret[0], 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[0])        
EndFunc   ;==>LoadKeyboardLayout
发表于 2010-7-17 01:31:21 | 显示全部楼层
1.如何确定它目前工作在什么输入法状态下(简体中文-美式键盘、智能ABC等):
http://www.autoitx.com/forum.php ... 53&fromuid=1003
2.切换输入法:
http://www.autoitx.com/thread-9552-1-1.html
自己领悟下里面的精髓,你的问题自然迎刃而解
PS:以上链接皆为搜索本论坛所得!
发表于 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +25 收起 理由
afan + 25

查看全部评分

发表于 2010-7-17 06:01:16 | 显示全部楼层
原来在注册表里有显示...
发表于 2010-7-17 11:57:00 | 显示全部楼层
好贴 收藏
输入法的问题以前碰到过。。不过lynfr8的这些资料又够我看一阵子的了
发表于 2011-6-8 17:24:06 | 显示全部楼层
需要好好学习了呀。:)强大。
发表于 2017-9-16 11:10:54 | 显示全部楼层
好贴  收藏!
发表于 2019-8-26 18:25:53 | 显示全部楼层
最近被输入法干扰所困扰,学习学习。
发表于 2019-8-30 08:40:56 | 显示全部楼层
输入法干扰所困扰我已经无语,以前以为是程序不执行是代码问题,后来才发现是输入法。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 05:12 , Processed in 0.088053 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表