本帖最后由 辣椒龙 于 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
|